Gateways
Шлюз (Gateway)
используется для управления потоками исполнения (или, как описано в BPMN 2.0, токенами исполнения).
Шлюз
может собирать или выпускать токены. Токен следует по потокам управления (Sequence Flow) и содержит текущее состояние переменных.Графически
Шлюз
изображается как ромб с каким-нибудь символом внутри. Символ указывает на тип шлюза.
Увеличить
Доступны 4 типа шлюзов:
- Исключающий шлюз (Exclusive Gateway);
- Включающий шлюз (Inclusive Gateway);
- Параллельный шлюз (Parallel Gateway);
- Событийный шлюз (Event-based Gateway).
В Палитре шлюзы находятся в папке "Gateways":

Увеличить
В свойствах
Шлюзов
4 вкладки:- General
- Gateway (описана для каждого типа шлюза)
- Marker
- Execution Listeners
Вкладка "Gateway" в каждом шлюзе содержит поле "Gateway Direction", говорящее о функциональном типе шлюза.
Есть возможность выбрать один из четырех вариантов:
Converging
(сходящийся). Означает, что у шлюза несколько входящих потоков (>=1) и один или ни одного исходящего.Diverging
(расходящийся). Означает, что у шлюза один или ни одного входящего потока и несколько исходящих.Mixed
(совмещенный). Совмещает в себе сходящийся и расходящийся типы. Т.е. у шлюза несколько входящих потоков и несколько исходящих.Unspecified
(неуказанный). Тип не указан.
Для каждого шлюза необходимо выбрать правильный вариант, соответствующий набору потоков управления, иначе валидация модели выдаст ошибку.
Система содержит следующие требования валидации:

Увеличить
- Эксклюзивный шлюз может либо соединять, либо разделять потоки;
- Шлюз стоящий после события должен разделять поток;
- Неэксклюзивный шлюз должен либо соединять, либо разделять потоки;
- Параллельный шлюз может либо соединять, либо разделять потоки.
Описание
Исключающий шлюз
используется для принятия решения в модели процесса.
Когда выполнение поступает на этот шлюз, все исходящие потоки последовательности оцениваются в том порядке, в котором они определены.- Если у потока нет условия, то оно по умолчанию всегда "истина".
- Если как "истинно" определились условия более чем одного потока, то первый, указанный в XML схеме, выбирается для продолжения процесса.
- Если ни один поток не может быть выбран, то выдаtтся исключение.
Исключающий шлюз
также известен как шлюз XOR, т.е. "исключающее или", или же, более технически верно, "шлюз, основанный на исключении данных"Графическое представление
Исключающий шлюз
изображается как ромб с символом "х" внутри, напоминающим о логическом "ИЛИ":
Увеличить
XML представление
Пример XML представления исключающего шлюза:
exclusiveGateway type=xml<bpmn2:exclusiveGateway id="a8d53e76-4eac-40a7-9fb5-04f13171a40e" sbt:marker.type="Markable" sbt:sbtType="com.sbt.bpms.modeler.plugin.marker.markableExclusiveGateway" name="New Exclusive Gateway" gatewayDirection="Diverging"> <bpmn2:incoming>e76c1ed2-9a5e-4433-95c8-0cbbcd57d269</bpmn2:incoming> <bpmn2:outgoing>c10109ac-08aa-4df1-a766-5df0ba9832e6</bpmn2:outgoing> <bpmn2:outgoing>a8aa845b-6ff3-452e-85e6-4dac4555d60a</bpmn2:outgoing> <bpmn2:outgoing>ff570165-48f5-4f96-b9f2-71dfe466904b</bpmn2:outgoing> </bpmn2:exclusiveGateway>
Описание условий содержится в коде самих потоков управления (см. раздел Работа с Sequence Flow) .
Но условия на потоки также можно добавлять, убирать или редактировать в свойствах шлюза на вкладке "Gateway" в таблице "Sequence Flow List" (см. ниже).
Вкладка Gateway

Увеличить
В поле "Gateway Direction" должно быть выбрано одно из значений
Converging (сходящийся)
или Diverging (расходящийся)
, в зависимости от набора входящих и исходящих потоков. Иначе валидация выдаст ошибку.Таблица "Sequence Flow List" служит для редактирования условий на потоках.
Для этого необходимо в строке нужного потока перейти в режим редактирования - нажмите кнопку:

Увеличить
Откроется дополнительная область "Sequence Flow Details" для введения условия:

Увеличить
Эта область дублирует вкладку "Sequence Flow" выбранного потока управления, настройка описана в разделе Работа с Sequence Flow.
Описание
Включающий (или всесторонний) шлюз
можно рассматривать как комбинацию Исключающего
и Параллельного шлюза
. Можно прописать условия для выбора исходящего потока и шлюз будет их проверять.
Те из них, у которых проверка выдаст "истинно", будут запущены для одновременного исполнения (при этом для каждого потока управления будет свой поток исполнения).
Также включающий шлюз может быть запущен более, чем одним потоком исполнения.
Все существующие входящие потоки исполнения доходя до включающего шлюза будут ждать, пока до шлюза дойдут все активные потоки исполнения (т.е. потоки исполнения всех потоков управления, имеющих маркер процесса).
Другими словами, Включающий шлюз
будет ждать, пока в нем соберутся потоки исполнения всех исполняющихся потоков управления.
Только когда соберутся все запущенные потоки, соединяющий Включающий шлюз
позволит продолжить исполнение процесса.Включающий шлюз
не обязательно должен быть сбалансирован (т.е. не обязательно должен иметь совпадающее количество входящих/исходящих потоков управления для включающих шлюзов, работающих в паре).
Шлюз лишь ждет, пока все соберутся потоки исполнения по всем активным потокам управления, и создает потоки исполнения для каждого из исходящих потоков управления, не находящегося под влиянием других конструкций модели процесса управления.Графическое представление
Включающий шлюз
изображается в виде ромба с символом круга внутри:
Увеличить
XML представление
Пример XML представления включающего шлюза:
inclusiveGateway type=xml<bpmn2:inclusiveGateway id="fa14bc0f-f581-458c-9903-d68f4e98debd" sbt:marker.type="Markable" sbt:sbtType="com.sbt.bpms.modeler.plugin.marker.markableInclusiveGateway" name="New Inclusive Gateway" gatewayDirection="Converging"> <bpmn2:incoming>fa8f3019-6d5b-4fe1-aebb-02cbae2d535a</bpmn2:incoming> <bpmn2:outgoing>acb39d13-d3c8-43be-b64c-c6575554b478</bpmn2:outgoing> </bpmn2:inclusiveGateway>
Описание условий содержится в коде самих потоков управления см. в разделе Работа с Sequence Flow.
Но условия на потоки также можно добавлять, убирать или редактировать в свойствах шлюза на вкладке "Gateway" в таблице "Sequence Flow List" (Gateway).
Вкладка Gateway

Увеличить
В поле "Gateway Direction" должно быть выбрано одно из значений
Converging (сходящийся)
или Diverging (расходящийся)
, в зависимости от набора входящих и исходящих потоков, иначе валидация выдаст ошибку.Таблица "Sequence Flow List" служит для редактирования условий на потоках.
Для этого необходимо в строке нужного потока перейти в режим редактирования - нажмите кнопку:

Увеличить
Откроется дополнительная область "Sequence Flow Details" для введения условия:

Увеличить
Эта область дублирует вкладку "Sequence Flow" выбранного потока управления, настройка описана в разделе Работа с Sequence Flow.
Описание
Шлюзы могут быть использованы для того, чтобы создать в процессе одновременно исполняющиеся потоки управления.
Параллельный шлюз
, который позволяет разветвить поток исполнения на несколько или собрать одновременно исполняющиеся потоки исполнения для продолжения в одном.
Шлюз ожидает завершения всех потоков исполнения по всем потокам управления, приходящим в шлюз. Лишь после того, как все потоки достигнут шлюза, процесс будет продолжен.
Все исходящие потоки управления исполняются одновременно, формируя отдельный исполняемый поток для каждой из ветвей.Важное отличие от остальных шлюзов состоит в том, что параллельный шлюз не проверяет условия. Если на потоках управления, соединенных с параллельным шлюзом, прописаны какие-то условия, то они игнорируются.
Параллельный шлюз
не обязательно должен быть сбалансирован (т.е. количество исходящих и входящих потоков управления не обязательно должно быть одинаково для парных параллельных шлюзов). Параллельный шлюз просто ждёт прихода потоков исполнения по всем входящим потокам управления и создаёт одновременные потоки исполнения по всем исходящим потокам управления, не зависимо от прочих конструкций модели процесса.Графическое представление
Параллельный шлюз
изображается в виде ромба с символом + внутри, напоминающим о логическом "И":
Увеличить
XML представление
Пример XML представления параллельного шлюза:
parallelGateway type=xml<bpmn2:parallelGateway id="ffa4a847-56b0-43ed-91a2-668b9753f239" sbt:marker.type="Markable" sbt:sbtType="com.sbt.bpms.modeler.plugin.marker.markableParallelGateway" name="New Parallel Gateway" gatewayDirection="Converging"> <bpmn2:incoming>e614f726-0fe9-4184-a7a2-9157aa0b8a78</bpmn2:incoming> <bpmn2:incoming>bf23d547-616b-498f-a933-cc2c7126b1b2</bpmn2:incoming> <bpmn2:outgoing>a11eb55c-7df0-4cf6-bec8-b6956bbc7ed0</bpmn2:outgoing> </bpmn2:parallelGateway>
Вкладка Gateway

Увеличить
В поле "Gateway Direction" должно быть выбрано одно из значений
Converging (сходящийся)
или Diverging (расходящийся)
, в зависимости от набора входящих и исходящих потоков.
Иначе валидация выдаст ошибку.Описание
Событийный шлюз
позволяет принимать решение, базируясь на Событиях (Events)
, а не на условиях. Каждый исходящий поток управления должен входить в Промежуточное Ожидающее Событие (Intermediate Catch Event)
.
Когда поток исполнения достигает событийного шлюза, исполнение приостанавливается и для каждого из исходящих потоков управления создаётся подписка на событие.Обратите внимание, что потоки управления, исходящие из событийного шлюза, отличаются от обычных потоков управления.
Эти потоки никогда не исполняются в действительности, они только позволяют определить, какие события должен ожидать дошедший до событийного шлюза поток исполнения.
Событийный шлюз
должен иметь два или более исходящих потоков управления.К событийному шлюзу применимы следующие ограничения:- Исходящие из
событийного шлюза
потоки управления могут подключаться только к элементам типаПромежуточное Ожидающее Событие
. Задача "Получения Сообщений (Receive Task)" не может быть использована для этой цели, Activity не поддерживает данный функционал. Промежуточное Ожидающее Событие
, подключенное к событийному шлюзу, должно иметь не более одного входящего потока управления.
Пример:

Увеличить
В данном примере событийный шлюз подписывается на 2 события: ожидание 10 минут и получение сигнала.
Если в течении 10 минут придет сигнал, то процесс пойдет по нижней стрелочке, т.к. это событие произошло первым.
Если нет (по прошествии 10 минут событие ожидания считается выполненным), то по верхней.
Графическое представление
Событийный шлюз изображается в виде ромба со специфическим символом внутри:

Увеличить
XML представление
Пример XML представления событийного шлюза:
eventBasedGateway type=xml<bpmn2:eventBasedGateway id="cfcd7140-c3d3-4a18-b33e-c743d5c76729" sbt:marker.type="Markable" sbt:sbtType="com.sbt.bpms.modeler.plugin.marker.markableEventBasedGateway" name="New Event Based Gateway" gatewayDirection="Diverging" eventGatewayType="Parallel" instantiate="true"> <bpmn2:incoming>cf60b836-dab1-4b59-a860-e9847937f7ff</bpmn2:incoming> <bpmn2:outgoing>bd304eb4-6b58-4ae4-b873-5e32ae7a8118</bpmn2:outgoing> <bpmn2:outgoing>bdb7f27e-9192-465d-9364-7eace5c3d6d0</bpmn2:outgoing> </bpmn2:eventBasedGateway>
Вкладка Gateway

Увеличить
-
Поле "Event Gateway Type" имеет на выбор два значения:
Exclusive
иParallel
. От выбора значения зависит, как будут выполняться исходящие потоки: выберется один поток по первому выполнившемуся событию (как в "Exclusive Gateway") или будут выполнены все (как в "Parallel Gateway"). По умолчанию выбран режимExclusive
и в код не пишется. На текущий момент данное поле не используется. -
В поле "Gateway Direction" должно быть выбрано значение Diverging (расходящийся) в связи с ограничениями шлюза. Иначе валидация выдаст ошибку.
-
Флаг "Instantiate" служит для создания другого типа шлюза:
Instantiate (Start) Event Gateway
. Этот шлюз используется для создания экземпляра процесса. При установке флага "Instantiate" меняется графическое изображение шлюза, причем оно разное для разных значений поля "Event Gateway Type". По умолчанию этот флаг не выбран и в код не пишется. На данный момент это поле не используется. -
Таблица "Sequence Flow List" служит для редактирования условий на потоках. Чтобы перейти в режим редактированния, нажмите пиктограмму "карандаш". Откроется дополнительная область "Sequence Flow Details" для введения условия:
Увеличить
Эта область дублирует вкладку "Sequence Flow" выбранного потока управления, работа с ней описана в разделе Работа с Sequence Flow.