Подпроцессы и вызовы процессов
Подпроцесс — это действие, которое содержит другие действия, шлюзы, события и т. д. и само образует процесс внутри более крупного процесса. Подпроцессы позволяют моделировать иерархически и получать высокоуровневое сквозное представление бизнес-процесса. Подпроцессы могут быть вложенными.
Кроме того, подпроцесс создает новую область для переменных процесса и событий. События, сгенерированные во время выполнения подпроцесса, может перехватить граничное событие подпроцесса, и область такого события ограничена подпроцессом.
Jmix BPM поддерживает следующие подпроцессы и вызовы процессов:
Встроенный подпроцесс
Подпроцесс, полностью определенный внутри родительского процесса, называется встроенным. Встроенные подпроцессы нельзя использовать повторно. Другими словами, их нельзя вызвать откуда-либо еще: они неотъемлемая часть родительского процесса.
Подпроцесс изображается прямоугольником со скругленными углами. Чтобы создать подпроцесс, выберите
в палитре и поместите его на холст.
Затем можно перетащить в подпроцесс существующие элементы или создать в нем новые. У встроенного подпроцесса может быть только одно пустое начальное событие; другие типы начальных событий не допускаются.
Встроенный подпроцесс определяется элементом subProcess. Все действия, шлюзы, события и т. д., входящие в подпроцесс, должны находиться внутри этого элемента.
<subProcess id="Activity_17a4us1" name="Subprocess">
<startEvent id="subProcessStart" />
... other subprocess elements ...
<endEvent id="subProcessEnd" />
</subProcess>
В моделере BPMN можно задать следующие свойства встроенного подпроцесса:
Свойство |
Описание |
Id |
Идентификатор элемента. Он генерируется автоматически, но его можно заменить на более понятный, чтобы логи было проще читать. |
Name |
Имя элемента. |
Multi instance |
|
Execution listeners |
См. Слушатели выполнения. |
Asynchronous execution |
Обновлено в Jmix 3.1 |
Documentation |
Описание и дополнительные сведения об элементе. |
Событийный подпроцесс
Событийный подпроцесс — это подпроцесс, который запускается событием. Его можно добавить на уровне процесса или на уровне любого подпроцесса.
Событие, которое запускает событийный подпроцесс, настраивается с помощью начального события. Событийный подпроцесс могут запускать, например, события сообщения, ошибки, эскалации, сигнала или таймера. Когда создается область (экземпляр процесса или подпроцесс), содержащая событийный подпроцесс, движок создает подписку на событие для начального события сообщения или сигнала и задание таймера для начального события таймера. Они удаляются, когда область уничтожается. Начальным событиям ошибки и эскалации не нужно ни то, ни другое.
Событийные подпроцессы изображаются прямоугольниками со скругленными углами и пунктирной границей. Чтобы создать событийный подпроцесс, добавьте встроенный подпроцесс, а затем измените его на событийный:
Теперь можно продолжить проектирование событийного подпроцесса.
|
Пустые начальные события не поддерживаются в событийных подпроцессах. Ошибки при развертывании или выполнении не возникает, но такой подпроцесс никогда не запустится. |
В моделере BPMN у событийного подпроцесса те же свойства, что и у встроенного подпроцесса.
Событийный подпроцесс представлен в XML так же, как встроенный подпроцесс. Кроме того, атрибут triggeredByEvent должен иметь значение true:
<subProcess id="event-subprocess" name="Event subprocess" triggeredByEvent="true"> (1)
<sequenceFlow id="Flow_14hzcqy" sourceRef="start-message-event" targetRef="Activity_0iuoq5t" />
<startEvent id="start-message-event"> (2)
<messageEventDefinition id="MessageEventDefinition_1hzz5hc" messageRef="cancel-order" />
</startEvent>
... other subprocess elements ...
</subProcess>
| 1 | атрибут triggeredByEvent |
| 2 | начальное событие сообщения |
Ниже приведен пример событийного подпроцесса, который запускается начальным событием ошибки. Событийный подпроцесс находится на «уровне процесса», то есть его область — экземпляр процесса:
Событийный подпроцесс можно определить во встроенном подпроцессе. В этом случае, когда срабатывает событие ошибки, событийный подпроцесс получает доступ к локальным переменным подпроцесса:
Если используется граничное событие ошибки, внешний обработчик события не видит локальные переменные:
Транзакционный подпроцесс
Транзакционный подпроцесс — это встроенный подпроцесс, с помощью которого несколько действий можно объединить в транзакцию. Транзакция — это логическая единица работы, которая объединяет набор отдельных действий так, что они либо все выполняются успешно, либо все завершаются неудачей.
Транзакционный подпроцесс изображается прямоугольником со скругленными углами и двойной границей. Чтобы создать транзакционный подпроцесс, добавьте встроенный подпроцесс, а затем измените его на транзакционный:
В моделере BPMN у транзакционного подпроцесса можно задать только следующие свойства:
Свойство |
Описание |
Id |
Идентификатор элемента. Он генерируется автоматически, но его можно заменить на более понятный, чтобы логи было проще читать. |
Name |
Имя элемента. |
В XML транзакционный подпроцесс представлен тегом transaction:
<transaction id="transaction-subprocess" name="Transaction subprocess">
. . .
</transaction>
У транзакции может быть три исхода:
- Успешное завершение
-
Если транзакционный подпроцесс завершается обычным образом, он считается успешным и основной процесс продолжается по исходящим потокам операций. Успешную транзакцию можно компенсировать, если позже в процессе генерируется событие компенсации.
Как и «обычный» встроенный подпроцесс, транзакционный подпроцесс можно компенсировать после успешного завершения с помощью промежуточного генерирующего события компенсации.
- Отмена
-
Если исполнение доходит до конечного события отмены, транзакция считается отмененной. В этом случае все исполнения прерываются и удаляются. Затем единственное оставшееся исполнение переходит на граничное событие отмены, которое запускает компенсацию. После завершения компенсации процесс выходит из транзакционного подпроцесса по исходящим потокам операций граничного события отмены.
- Сбой
-
Транзакция завершается сбоем, если генерируется событие ошибки, которое не перехватывается в области транзакционного подпроцесса. Это относится и к случаю, когда ошибка перехватывается на границе транзакционного подпроцесса. В таких случаях компенсация не выполняется.
|
Важно не путать транзакционный подпроцесс BPMN с техническими (ACID) транзакциями. Подробнее см. в разделе Транзакции BPMN. |
Вызов процесса
Вызов процесса запускает повторно используемый процесс или глобальную задачу из другого процесса. Он помогает разбить сложные процессы на небольшие управляемые части и способствует повторному использованию.
В отличие от встроенного подпроцесса, вызов процесса — это внешний подпроцесс.
Когда исполнение процесса доходит до вызова процесса, создается новое исполнение, дочернее по отношению к исполнению, которое дошло до вызова процесса. Это дочернее исполнение выполняет подпроцесс и при необходимости создает параллельные дочерние исполнения, как в обычном процессе. Родительское исполнение ждет полного завершения подпроцесса, а затем продолжает исходный процесс.
Вызов процесса изображается прямоугольником со скругленными углами, как обычная задача, но с толстой границей и маркером подпроцесса внутри:
Вызов процесса — это обычное действие, для которого нужен атрибут calledElement, ссылающийся на определение процесса по ключу.
На практике это значит, что в calledElement используется id процесса.
<callActivity id="Activity_08ermzt" name="Call activity"
calledElement="data-task-sample" (1)
flowable:inheritBusinessKey="true"> (2)
<extensionElements>
<flowable:in sourceExpression="${customer.name}" (3)
target="customerName" />
<flowable:out source="customerName" (4)
target="customerName" />
</extensionElements>
<incoming>Flow_0sdrrfm</incoming>
</callActivity>
| 1 | вызываемый элемент, по умолчанию задается id процесса (ключом определения процесса) |
| 2 | бизнес-ключ будет унаследован |
| 3 | входное сопоставление по выражению |
| 4 | выходное сопоставление по переменной |
|
Движок находит определение вызываемого процесса во время выполнения. Поэтому при необходимости подпроцесс можно развертывать независимо от вызывающего процесса. |
В моделере BPMN можно задать следующие свойства вызова процесса:
Свойство |
Описание |
||
Id |
Идентификатор элемента. Он генерируется автоматически, но его можно заменить на более понятный, чтобы логи было проще читать. |
||
Name |
Имя элемента. |
||
Called element |
Существующее определение процесса, которое нужно вызвать.
|
||
Called element type |
По умолчанию используется параметр Key, который вызывает последнюю версию процесса. Конкретную версию процесса можно вызвать по ее id. |
||
Business key expression, Inherit business key |
Бизнес-ключ можно задать выражением или унаследовать от родительского процесса. Подробнее см. бизнес-ключ. |
||
Inherit process variables |
Вызов процесса может унаследовать переменные процесса от родительского процесса. При запуске вызываемого процесса создаются новые экземпляры переменных процесса, отдельные от исходных ссылок. |
||
In mapping |
Параметры в вызываемый процесс можно передать, сопоставив существующие переменные процесса (source) с переменными вызываемого процесса (target):
Также можно использовать выражения:
|
||
Out mapping |
Аналогично можно сопоставить переменные вызываемого процесса (source) с переменными родительского процесса (target):
|
||
Multi instance |
|||
Execution listeners |
См. Слушатели выполнения. |
||
Asynchronous execution |
Обновлено в Jmix 3.1 |
||
Documentation |
Описание и дополнительные сведения об элементе. |
Пользовательские задачи в вызове процесса
Если в вызываемом процессе есть пользовательские задачи, назначенные пользователи видят их в списке задач (экран My tasks) под именем вызываемого процесса, а не родительского. Поэтому при создании процессов важно использовать бизнес-ключ.
Если вы хотите управлять всеми задачами своего процесса, а в нем есть вызовы процессов, учитывайте это.