В нотациии BPMN есть блок элементов, которые позволяют создавать параллельные ветки процесса. bpmOnline использует следующие элементы:
1) Взаимоисключающее или
Из потоков, которые выходят с данного элемента процесс пойдет только по одному.
Однако, если в такой элемент входит несколько потоков, то процесс пойдет дальше при входе одного из потов.
2) Событийное или
Данный элемент предполагает и ожидает, что после него будет элемент, который является сигналом.В системе есть три элемента, которые являются сигналами и могут быть использованы после "Событийного или" - промежуточные обрабатывающие сигналы:
- Сигнал
- Сообщение
- Таймер
3) Или
Используйте этот элемент "На выход", если процесс необходимо запустить по некоторым веткам, которые выходят из элемента "Или"
4) И
Дойдя до этого элемента, процесс пойдет по всем веткам, которые выходят с элемента "И" - так работает элемент "На выход". "На вход" этот элемент ожидает завершения всех входящих в него веток.
Приведу несколько кейсов использования данных элементов.
Первый кейс:
параллельно создаются две задачи. В случае, если одна из задач не соответствует определенному условию, тогда процесс создает данные задачи повторно. Иначе, "идет" дальше.
Неправильная реализация данного процесса выглядит так:
После запуска, процесс дойдет до элемента "И", который будет ожидает два потока. Поскольку второй поток никогда не дойдет, то процесс будет находиться в состоянии "Выполняется" до того, как пользователь его отменит.
Правильная реализация:
Перед элементом "И" был добавлен элемент "Взаимоисключающее ИЛИ", который ожидает на вход только одну из двух веток.
Второй кейс:
При изменении состояния счета необходимо выполнить одну из веток процесса:
- При изменении на "Оплачен частично" процесс идет по верхней ветке
- При изменении на "Оплачен полностью" процесс идет по нижней ветке
Неправильная реализация:
Если данный процесс запускается при состоянии счета "Не оплачен", тогда при достижении процессом элемента "Взаимоисключающее ИЛИ" процесс остановится, потому что не одно из условия не выполняется.
Правильная реализация:
Процесс дойдет до "Событийного или" и будет ожидать сигналов, настроенных после него (то есть, изменение состояния счета). Фильтрация, которая вам необходима, а также колонки, на изменения которых срабатывет сигнал, настраивается непосредственно в промежуточном сигнале.