Кейс: контракты переменных и gateway в BPMN
Ситуация
В большом процессе проявлялись внешне разные ошибки:
- развилка иногда не выбирала ни одной ветки;
- логическое значение в одном запуске было
Boolean, а в другом — строкой; - создание пользовательской задачи падало, если переданный текст превышал ограничение следующей системы;
- лишние асинхронные границы усложняли повтор и диагностику.
Общий источник проблем — неявные контракты между шагами процесса.
Диагностика
Я проверил каждую границу как отдельный контракт:
| Граница | Что проверял |
|---|---|
| вход процесса | имя, наличие и тип переменной |
| gateway | условия всех ветвей и запасной маршрут |
| внешний вызов | тип и допустимый размер полей |
| async continuation | повторяемость и транзакционную границу |
Тип логической переменной оказался нестабильным. Я перестал полагаться на
неявное преобразование строки "true" и нормализовал значение до Boolean
перед gateway. Exclusive gateway без подходящего условия и без default flow не
знает, куда продолжить выполнение.
Мой вклад
Я:
- нормализовал логические переменные до
Boolean; - настроил default flow там, где нужен безопасный запасной маршрут;
- ограничил размер текста до передачи во внешнюю систему;
- убрал асинхронность с шагов, которым она не давала полезной независимости.
Результат
Поведение процесса стало определённым для неполных и пограничных входных данных. Ошибка больше не зависела от случайного представления boolean или скрытого ограничения следующей системы.
Технический вывод
BPMN-диаграмма показывает поток, но контракт живёт ещё и в типах переменных, ограничениях данных и настройках движка. Эти части нужно проверять вместе.