Подпроцессы и вызовы процессов

Подпроцесс — это действие, которое содержит другие действия, шлюзы, события и т. д. и само образует процесс внутри более крупного процесса. Подпроцессы позволяют моделировать иерархически и получать высокоуровневое сквозное представление бизнес-процесса. Подпроцессы могут быть вложенными.

Кроме того, подпроцесс создает новую область для переменных процесса и событий. События, сгенерированные во время выполнения подпроцесса, может перехватить граничное событие подпроцесса, и область такого события ограничена подпроцессом.

Jmix BPM поддерживает следующие подпроцессы и вызовы процессов:

subprocess types

Встроенный подпроцесс

Подпроцесс, полностью определенный внутри родительского процесса, называется встроенным. Встроенные подпроцессы нельзя использовать повторно. Другими словами, их нельзя вызвать откуда-либо еще: они неотъемлемая часть родительского процесса.

Графическая нотация

Подпроцесс изображается прямоугольником со скругленными углами. Чтобы создать подпроцесс, выберите icon subprocess в палитре и поместите его на холст.

create subprocess

Затем можно перетащить в подпроцесс существующие элементы или создать в нем новые. У встроенного подпроцесса может быть только одно пустое начальное событие; другие типы начальных событий не допускаются.

XML-представление

Встроенный подпроцесс определяется элементом subProcess. Все действия, шлюзы, события и т. д., входящие в подпроцесс, должны находиться внутри этого элемента.

<subProcess id="Activity_17a4us1" name="Subprocess">
  <startEvent id="subProcessStart" />

... other subprocess elements ...

  <endEvent id="subProcessEnd" />
 </subProcess>
Свойства

В моделере BPMN можно задать следующие свойства встроенного подпроцесса:

subprocess properties

Свойство

Описание

Id

Идентификатор элемента. Он генерируется автоматически, но его можно заменить на более понятный, чтобы логи было проще читать.

Name

Имя элемента.

Multi instance

См. Множественный экземпляр.

Execution listeners

См. Слушатели выполнения.

Asynchronous execution

  • Asynchronous

  • Exclusive

  • Asynchronous leave

  • Asynchronous leave exclusive

Обновлено в Jmix 3.1

Documentation

Описание и дополнительные сведения об элементе.

Событийный подпроцесс

Событийный подпроцесс — это подпроцесс, который запускается событием. Его можно добавить на уровне процесса или на уровне любого подпроцесса.

Событие, которое запускает событийный подпроцесс, настраивается с помощью начального события. Событийный подпроцесс могут запускать, например, события сообщения, ошибки, эскалации, сигнала или таймера. Когда создается область (экземпляр процесса или подпроцесс), содержащая событийный подпроцесс, движок создает подписку на событие для начального события сообщения или сигнала и задание таймера для начального события таймера. Они удаляются, когда область уничтожается. Начальным событиям ошибки и эскалации не нужно ни то, ни другое.

Графическая нотация

Событийные подпроцессы изображаются прямоугольниками со скругленными углами и пунктирной границей. Чтобы создать событийный подпроцесс, добавьте встроенный подпроцесс, а затем измените его на событийный:

creating event subprocess

Теперь можно продолжить проектирование событийного подпроцесса.

creating event subprocess 2

Пустые начальные события не поддерживаются в событийных подпроцессах. Ошибки при развертывании или выполнении не возникает, но такой подпроцесс никогда не запустится.

Свойства

В моделере BPMN у событийного подпроцесса те же свойства, что и у встроенного подпроцесса.

XML-представление

Событийный подпроцесс представлен в 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 начальное событие сообщения
Пример

Ниже приведен пример событийного подпроцесса, который запускается начальным событием ошибки. Событийный подпроцесс находится на «уровне процесса», то есть его область — экземпляр процесса:

event subprocess example

Событийный подпроцесс можно определить во встроенном подпроцессе. В этом случае, когда срабатывает событие ошибки, событийный подпроцесс получает доступ к локальным переменным подпроцесса:

event subprocess error

Если используется граничное событие ошибки, внешний обработчик события не видит локальные переменные:

subprocess error

Транзакционный подпроцесс

Транзакционный подпроцесс — это встроенный подпроцесс, с помощью которого несколько действий можно объединить в транзакцию. Транзакция — это логическая единица работы, которая объединяет набор отдельных действий так, что они либо все выполняются успешно, либо все завершаются неудачей.

Графическая нотация

Транзакционный подпроцесс изображается прямоугольником со скругленными углами и двойной границей. Чтобы создать транзакционный подпроцесс, добавьте встроенный подпроцесс, а затем измените его на транзакционный:

transaction subprocess
Свойства

В моделере BPMN у транзакционного подпроцесса можно задать только следующие свойства:

Свойство

Описание

Id

Идентификатор элемента. Он генерируется автоматически, но его можно заменить на более понятный, чтобы логи было проще читать.

Name

Имя элемента.

XML-представление

В XML транзакционный подпроцесс представлен тегом transaction:

<transaction id="transaction-subprocess" name="Transaction subprocess">
  . . .
</transaction>
Возможные исходы транзакции

У транзакции может быть три исхода:

Успешное завершение

Если транзакционный подпроцесс завершается обычным образом, он считается успешным и основной процесс продолжается по исходящим потокам операций. Успешную транзакцию можно компенсировать, если позже в процессе генерируется событие компенсации.

Как и «обычный» встроенный подпроцесс, транзакционный подпроцесс можно компенсировать после успешного завершения с помощью промежуточного генерирующего события компенсации.

Отмена

Если исполнение доходит до конечного события отмены, транзакция считается отмененной. В этом случае все исполнения прерываются и удаляются. Затем единственное оставшееся исполнение переходит на граничное событие отмены, которое запускает компенсацию. После завершения компенсации процесс выходит из транзакционного подпроцесса по исходящим потокам операций граничного события отмены.

Сбой

Транзакция завершается сбоем, если генерируется событие ошибки, которое не перехватывается в области транзакционного подпроцесса. Это относится и к случаю, когда ошибка перехватывается на границе транзакционного подпроцесса. В таких случаях компенсация не выполняется.

transaction subprocess example

Важно не путать транзакционный подпроцесс BPMN с техническими (ACID) транзакциями. Подробнее см. в разделе Транзакции BPMN.

Вызов процесса

Вызов процесса запускает повторно используемый процесс или глобальную задачу из другого процесса. Он помогает разбить сложные процессы на небольшие управляемые части и способствует повторному использованию.

В отличие от встроенного подпроцесса, вызов процесса — это внешний подпроцесс.

Когда исполнение процесса доходит до вызова процесса, создается новое исполнение, дочернее по отношению к исполнению, которое дошло до вызова процесса. Это дочернее исполнение выполняет подпроцесс и при необходимости создает параллельные дочерние исполнения, как в обычном процессе. Родительское исполнение ждет полного завершения подпроцесса, а затем продолжает исходный процесс.

Графическая нотация

Вызов процесса изображается прямоугольником со скругленными углами, как обычная задача, но с толстой границей и маркером подпроцесса внутри:

call activity
XML-представление

Вызов процесса — это обычное действие, для которого нужен атрибут 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 можно задать следующие свойства вызова процесса:

call activity properties

Свойство

Описание

Id

Идентификатор элемента. Он генерируется автоматически, но его можно заменить на более понятный, чтобы логи было проще читать.

Name

Имя элемента.

Called element

Существующее определение процесса, которое нужно вызвать.

Избегайте неуправляемой рекурсии! Технически процесс может вызвать другой экземпляр самого себя.

Called element type

По умолчанию используется параметр Key, который вызывает последнюю версию процесса. Конкретную версию процесса можно вызвать по ее id.

Business key expression, Inherit business key

Бизнес-ключ можно задать выражением или унаследовать от родительского процесса. Подробнее см. бизнес-ключ.

Inherit process variables

Вызов процесса может унаследовать переменные процесса от родительского процесса. При запуске вызываемого процесса создаются новые экземпляры переменных процесса, отдельные от исходных ссылок.

In mapping

Параметры в вызываемый процесс можно передать, сопоставив существующие переменные процесса (source) с переменными вызываемого процесса (target):

in mapping

Также можно использовать выражения:

in mapping expression

Out mapping

Аналогично можно сопоставить переменные вызываемого процесса (source) с переменными родительского процесса (target):

out mapping

Multi instance

См. Множественный экземпляр.

Execution listeners

См. Слушатели выполнения.

Asynchronous execution

  • Asynchronous

  • Exclusive

  • Asynchronous leave

  • Asynchronous leave exclusive

Обновлено в Jmix 3.1

Documentation

Описание и дополнительные сведения об элементе.

Пользовательские задачи в вызове процесса

Если в вызываемом процессе есть пользовательские задачи, назначенные пользователи видят их в списке задач (экран My tasks) под именем вызываемого процесса, а не родительского. Поэтому при создании процессов важно использовать бизнес-ключ.

Если вы хотите управлять всеми задачами своего процесса, а в нем есть вызовы процессов, учитывайте это.