Какие виды шлюзов есть в BPMN
Что проверяют
Умеете ли вы моделировать ветвления так, чтобы процесс исполнялся однозначно, а не просто рисовать ромбы. Следом почти всегда спрашивают, чем эксклюзивный шлюз отличается от инклюзивного и что произойдёт при неправильном слиянии веток.
Как отвечать
В BPMN 2.0 пять видов шлюзов, и большинство из них работает и на разветвление, и на слияние:
- эксклюзивный (XOR, пустой ромб или ромб с «X»): из исходящих потоков идёт ровно один, первый с истинным условием. Нужен поток по умолчанию, иначе при несовпадении всех условий движок остановится с ошибкой. На слиянии пропускает каждый входящий токен без ожидания;
- параллельный (AND, «+»): на разветвлении запускает все ветки без условий, на слиянии ждёт токены со всех входящих потоков;
- инклюзивный (OR, круг): запускает все ветки с истинным условием, одну или несколько. На слиянии ждёт только те ветки, которые реально были активированы;
- событийный (Event-based, пятиугольник в двойном круге): маршрут выбирает не условие, а событие, которое наступит первым. После него стоят только промежуточные события или задачи получения сообщения: например, «пришла оплата» против таймера «прошло 3 дня». Есть параллельный вариант, он используется для старта процесса;
- *комплексный («»)**: произвольное правило активации, например «продолжить, когда пришли 2 из 3 согласований». На практике встречается редко, и не все движки его исполняют.
Хороший ответ показывает, где маршрут решают данные (XOR, OR), а где внешнее событие (Event-based). Если в проекте был движок, например Camunda, упомяните, что условия на потоках пишутся выражениями над переменными процесса и их надо проверять на полноту.
Где спотыкаются
Сливают параллельные ветки эксклюзивным шлюзом. Токены проходят по одному, и задача после слияния выполняется дважды.
Сливают ветки после XOR параллельным шлюзом. Он ждёт токен из ветки, которая не запускалась, и процесс зависает навсегда.
Пишут в XOR пересекающиеся условия вроде «сумма больше 1000» и «клиент VIP» без потока по умолчанию. Для аналитика это двусмысленная схема, а для движка непредсказуемый маршрут.