Шлюзы в BPMN
Владимир Мозжечков, SmartechПродолжаем нашу серию мини-лекций по нотации BPMN 2.0 и сегодня мы поговорим про шлюзы (gateways). Если действия — это определенные операции, которые совершаются в нашем процессе, то шлюзы — это некоторые направляющие, которые позволяют нам контролировать ход выполнения нашего бизнес-процесса. Говоря простым языком, мы можем пойти по одному возможному пути, по другому пути или по нескольким сразу.
Например, банкомат при выдаче нам денег сначала проверит: а достаточно ли их на карте? Если бы не было логического ветвления процессов (или шлюзов), то он при любом исходе проверки либо всегда выдавал бы деньги или не выдавал никогда. По сути шлюзы — это аналог операторов if - else в программировании. Однако BPMN — это не совсем программирование и наши возможности в нотации ограничены, поэтому в ней предусмотрено приличное количество шлюзов, которых нам должно хватить предположительно на все случаи жизни. Визуально шлюз представляет из себя ромб, из которого выходят 2 или более стрелок (или потоков выполнения), их количество не ограничено. Конкретный вид шлюза определяется иконкой, которая нарисована внутри ромба. Часть шлюзов сопровождается условиями, а часть нет. Теперь давайте поговорим о каждом шлюзе в отдельности.

1. Эксклюзивный шлюз. Сопровождается условием. После него выполнение может пойти только по одному потоку. Выбор потока зависит от выполнения или не выполнения условий. Для каждого отдельного потока может быть свое собственное условие, но все эти условия обязаны быть взаимно исключающими.
2. Неэксклюзивный шлюз. Сопровождается условием. После него выполнение может пойти по одном потоку или по нескольким сразу, набор потоков произвольный. Выбор потока или потоков зависит от выполнения или не выполнения условий. Для каждого отдельного потока может быть свое собственное условие и эти условия НЕ обязаны быть взаимно исключающими.
3. Параллельный шлюз. Не сопровождается условием. После него выполнение пойдет по всем потокам сразу.
4. Событийный шлюз. Не сопровождается условием, однако первой же операцией в каждом исходящем из него потоке обязано быть событие (кружок) или событийное действие (прямоугольник). Событийное действие — это действие, которое напрямую связано с каким-то внешним событием. Например, «получить сообщение». В данном случае мы никак не сможем его получить, если оно к нам не придет, а приход сообщения — это уже событие. Исполнение после данного шлюза пойдет по тому потоку, в котором первым выполнится событие, идущее за шлюзом. Например, 2 события: ждать 1 минуту и ждать ввода пин-кода. Если введен пин-код, идем дальше. Если минута истекла раньше, сообщаем о том, что код не введен.
5. Сложный шлюз. Этим шлюзом можно пользоваться, если вашей ситуации не подходит ни один другой. По его использованию нет определенных рекомендаций, кроме одной: по возможности никогда его не использовать. Дело в том, что диаграммы призваны добавить наглядности и читабельности нашему описанию бизнес-процесса, а сложный шлюз решению этой задачи не способствует. Про него можно сказать только одно — он обязан иметь подробное описание того, как он работает.
6. Генерирующий событийный шлюз. Этот шлюз работает в точности так, как и событийный шлюз. Все отличие его заключается в том, что он создает новый экземпляр бизнес-процесса. Когда и зачем это может быть нужно? Например, когда несколько процессов могут взаимодействовать между собой. Например, один мастер начинает параллельно изготавливать несколько деталей на нескольких станках. Или в один оффлайн-магазин заходят несколько покупателей, которые потом в итоге могут встать в очередь.
7. Генерирующий параллельный шлюз. Этот шлюз очень похож на генерирующий событийный шлюз, он также создает новый экземпляр бизнес-процесса и во всех потоках, выходящих из него, также первым делом должны идти события. Отличие заключается в том, что он ожидает выполнения сразу всех событий. Когда все события во всех выходящих потоках выполняются, дальнейший ход бизнес-процесса продолжается параллельно по всем выходящим потокам.
Мы только что поговорили об открывающих шлюзах, но есть еще и закрывающие, или «собирающие» шлюзы. Они работают симметрично открывающим: если в открывающий шлюз входит 1 поток управления, а выходят несколько, то в закрывающий наоборот входят несколько, а выходит 1 поток.
Например, мы разделили выполнение нашего процесса на 3 параллельных потока с помощью параллельного шлюза (мы одновременно готовим суп, мясо и макароны), но потом нам надо собрать выполнение в один поток: едим мы 1 раз и 1 раз моем посуду. Для этого 3 потока приготовления еды должны у нас войти в 1 такой же параллельный шлюз, из которого выйдет 1 поток.
Как правило, закрывающий шлюз у нас такой же, как и открывающий за исключением событийных. Эксклюзивные событийные шлюзы мы закрываем обычными эксклюзивными шлюзами, а Генерирующий параллельный шлюз закрываем параллельным шлюзом.