BPMNImplementation
Реализация BPMN
Версия 4.6.0
© 2015-2023, ООО "Процессные технологии"
# Начальное состояние
Отличия от спецификации:
- должно быть привязано к роли
- может иметь стартовую форму
- может быть вызвано только явным запуском процесса.
# Переменная
Переменная — адресуемая область памяти, используемая для хранения данных. Характеризуется размером и форматом представления данных внутри адресуемой области. В RunaWFE размер переменной скрыт от пользователя, и пользователю известно только название формата.
Используются следующие форматы переменных:
Роль является переменной со специальным использованием.
# Роль
Соответствует BPMN (элемент Lane).
Роль характеризуется классом обработчика и конфигурацией, что можно назвать инициализатором для простоты. Эти свойства определяют как инициализируется роль, т.е. какие пользователи попадут в роль.
Роль инициализируется значением в случае:
- выполнения стартовой задачи (при условии настройки Доинициализация роли = да)
- прихода точки управления в задачу с этой ролью (при условии что значение роли не определено либо настройка Переинициализация роли = да
- при первом использовании в БП, например в обработчике (при использовании настройки ServerConfigurationGuide#process.swimlane.auto.initialization.enabled)
- при назначении ей значения как переменной
Значением роли может быть:
- 1 пользователь
- 1 группа
- 1 временная группа, состоящая из нескольких пользователей (которые определились инициализатором)
- 1 группа делегирования
- 1 группа эскалации
Роль можно использовать как переменную:
- присваивать ей значение другой роли или переменной типа Исполнитель, Пользователь или Группа
- получить текущее значение
# Действие
Соответствует BPMN (элемент User Task).
Если настройка Переинициализация роли установлена в да - то выполняется переинициализация роли на основании инициализатора, безусловно от текущего значения роли.
Если настройка Переинициализация роли установлена в нет - то принудительная переинициализация роли при создании задания не выполняется, используется текущее значение роли. И только если оно не определено - выполняется инициализация роли.
Если настройка Доинициализация роли установлена в да - то значение роли при выполнении задания становится равным пользователю, выполнившему задание.
Если настройка Доинициализация роли установлена в нет - то значение роли при выполнении задания не меняется.
Значения настроек по умолчанию задаются в настройках редактора.
значение настройки Переинициализация роли | значение настройки Доинициализация роли | типичная ситуация использования |
да | да | После выполнения задания можно получить информацию о выполнившем её пользователе. Но при этом закрепления дальнейших заданий за ним не происходит, в каждой задаче - переинициализация роли. |
да | нет | В длинных БП актуализация пользователей в роли. Например если роль инициализируется по отделу - то таким образом учитываются уволенные и вновь взятые сотрудники в старых БП. |
нет | да | Закрепление пула задач за одним пользователем. |
нет | нет | Роль инициализируется 1 раз в БП и далее не меняется. Затрудняюсь привести практичную ситуацию. |
# Аннотация
Соответствует BPMN.
# Задача сценария
Соответствует BPMN (элемент Script Task). Под скриптом подразумевается обработчик в системе.
# Таймер
Соответствует BPMN.
# Параллельный шлюз
Соответствует BPMN.
# Исключающий шлюз
Соответствует BPMN.
# Подпроцесс
Соответствует BPMN (только Reusable SubProcess).
# Работа с переменными
# В режиме копирования
В этом режиме использование в соответствии переменной определяет правила:
- read - при запуске подпроцесса значение переменной копируется в подпроцесс
- write - при завершении подпроцесса значение переменной копируется в родительский БП
- sync - при изменении значения переменной в подпроцессе оно будет изменено как в подпроцессе, так и в базовом БП.
# В режиме ID базового БП 4.3.0+
Режим "ID базового БП" предназначен для хранения переменных в единственном экземпляре. Этот режим включается настройкой base.process.id.variable.name и передачей в БП соответствующей переменной. Поддерживается иерархия любой вложенности.
При доступе на чтение возвращается первое непустое значение, найденное вверх по иерархии базовых БП.
При доступе на запись значение меняется в последнем базовом БП по иерархии, где определена переменная наличием.
В этом режиме использование в соответствии переменной определяет правила:
- read - при чтении значение переменной будет доступно из базового БП
- write - при завершении подпроцесса значение переменной копируется в родительский БП
- sync - при изменении значения переменной в подпроцессе оно меняется в базовом БП; при чтении значение переменной будет доступно из базового БП
При включённой настройке base.process.id.variable.read.all при чтении используется базовый БП для переменных с любым названием.
# Мультиподпроцесс
Отличия от спецификации (Multiple Instances Activity)
- иной механизм вычисления подпроцессов:
- по переменной типа "Список"
- по пользователям указанной группы
- по пользователям указанного отношения
- подпроцессы выполняются всегда параллельно
# Отправить сообщение, Получить сообщение
Близким аналогом в BPMN являются сигналы и сообщения.
Для отправки и получения сообщений используется JMS (Jboss Messaging).
Порядок обработки сообщений в процессе значения не имеет.
При этом узел-отправитель выполняется всегда без задержки (за исключением ошибочной ситуации), а узел-получатель ожидает сообщения, и выполнение процесса может находиться в этом узле неопределенно долго.
В сообщении передается информация:
- данные о маршрутизации в виде ключ:значение
- данные в виде ключ:значение переменной процесса
- время жизни хранения (опционально)
Данные о маршрутизации определяют получателя сообщения
Одно сообщение может быть обработано несколькими получателями.
Обрабатываются данные маршрутизации по четкому соответствию значений на стороне получателя.
пример
Отправитель: (тип="1",действие="добавить")
Такое сообщение будет обработано любым из получателей с настройками маршрутизации
Получатель: (тип="1") (в случае настройки)
Получатель: (тип="1",действие="добавить")
Получатель: () (в случае настройки)
и не будет обработано следующими получателями
Получатель: (тип="1",действие="удалить")
Получатель: (тип="1",действие="добавить",ожидание="да")
Получатель: (ожидание="да")
В конфигураторе параметров предусмотрены предопределенные значения:
по названию определения процесса ( ${currentDefinitionName} )
по названию текущего узла ( ${currentNodeName} )
по номеру экземпляра процесса ( ${currentInstanceId} )
Можно использовать переменные в значении свойства маршрутизатора (задается конструкцией ${названиеПеременной})
Структура и обработка данных сообщения позволяет задавать соответствие между переменными отправителя и получателя на любой из сторон (или с обеих сторон).
Время жизни сообщения предусмотрено для очистки сообщений из системы в случае, если для данных сообщений нет получателя (как правило в результате ошибки разработки процесса).
# Время жизни сообщений
Выставляется явно.
Значение "0" гарантирует хотя бы 1 попытку обработки, остальное по интуиции.
# В случае ошибки (отката транзакции)
- Узел-отправитель не отправит сообщение и выполнение откатится на прежнее состояние в процессе. Т.е. гарантируется что после прохождения узла-сообщения отправлено точно 1 сообщение.
- Узел-получатель вернет сообщение в очередь и оно будет обработано при следующей попытке (таймаут по умолчанию = 1 мин.)
# Многопоточная обработка сообщений
# До версии 4.1.0
Все сообщения обрабатываются параллельно, что вызывает конфликты транзакций в случае, если сообщения поступают в один и тот же процесс, а тем более - в один и тот же узел.
# В версии 4.1.0
Введена настройка receive.message.handle.in.sequence.enabled в system.properties (по умолчанию true).
Обрабатывать получение сообщений для узлов "Принять сообщение" по очереди (для устранения проблем с многопоточностью, возникающих в случае одновременного прихода нескольких сообщений в тот же узел определённого процесса).
# Начиная с версии 4.1.1
Все сообщения обрабатываются параллельно с синхронизацией по экземплярам процессов. Т.е. если сообщения адресованы в разные процессы - они будут обработаны параллельно, иначе - последовательно.
# Завершение потока
Близким аналогом в BPMN является None End Event.
# Завершение процесса
Близким аналогом в BPMN является “terminate” End Event.
# Бизнес-исключение планируется
В бизнес-процессе несколько элементов объединяются в объемлющую область (логическое компонование), к границе которой присоединяется элемент "Бизнес-исключение". В интерфейсе системы добавляется новое меню, в котором пользователь (который обладает соответствующими правами) может выбрать экземпляр бизнес-процесса, возможное бизнес-исключение и произвести генерацию бизнес-исключения. Список возможных бизнес-исключений создается в соответствии с набором объемлющих областей экземпляра бизнес-процесса, в которых в текущий момент времени находятся точки управления. Из элемента "Бизнес-исключение" можно совершить переход на другие элементы.