Кейс: контракты переменных и gateway в BPMN

Ситуация

В большом процессе проявлялись внешне разные ошибки:

  • развилка иногда не выбирала ни одной ветки;
  • логическое значение в одном запуске было Boolean, а в другом — строкой;
  • создание пользовательской задачи падало, если переданный текст превышал ограничение следующей системы;
  • лишние асинхронные границы усложняли повтор и диагностику.

Общий источник проблем — неявные контракты между шагами процесса.

Диагностика

Я проверил каждую границу как отдельный контракт:

ГраницаЧто проверял
вход процессаимя, наличие и тип переменной
gatewayусловия всех ветвей и запасной маршрут
внешний вызовтип и допустимый размер полей
async continuationповторяемость и транзакционную границу

Тип логической переменной оказался нестабильным. Я перестал полагаться на неявное преобразование строки "true" и нормализовал значение до Boolean перед gateway. Exclusive gateway без подходящего условия и без default flow не знает, куда продолжить выполнение.

Мой вклад

Я:

  1. нормализовал логические переменные до Boolean;
  2. настроил default flow там, где нужен безопасный запасной маршрут;
  3. ограничил размер текста до передачи во внешнюю систему;
  4. убрал асинхронность с шагов, которым она не давала полезной независимости.

Результат

Поведение процесса стало определённым для неполных и пограничных входных данных. Ошибка больше не зависела от случайного представления boolean или скрытого ограничения следующей системы.

Технический вывод

BPMN-диаграмма показывает поток, но контракт живёт ещё и в типах переменных, ограничениях данных и настройках движка. Эти части нужно проверять вместе.

Связанные заметки