Как использовать вилку Camunda / Activity BPMN и убивать ветки по событию?

Мне нужно сделать процесс с вилкой по двум путям:

  1. Путь с пользовательской задачей

  2. Путь с служебной задачей

см. изображение процесса

Процесс должен перейти в MoreTasks, если ServiceTask завершает вычисления, не дожидаясь реакции пользователя на UserTask.

Как я могу автоматически завершить UserTask после завершения ServiceTask без программирования на java (только с использованием нотации camunda bpmn)?

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


person Alexander    schedule 03.02.2016    source источник


Ответы (2)


Хорошо, это один из тех довольно редких случаев, когда Камунда удалил полезную функцию, которая была в движке Activiti. В Activiti можно (внутри BPMN) определить, будет ли сигнал выдаваться глобально (по умолчанию) или только текущему экземпляру процесса. Хотя это может не соответствовать спецификации BPMN, это было чрезвычайно полезно для таких сценариев, как ваш.

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

RuntimeService.signalEventReceived(String signalName, String executionId);

Обратитесь к документации Camunda для получения более подробной информации.

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

Теперь прикрепите обработчик событий Error Boundary к встроенному подпроцессу.

введите описание изображения здесь

Примерно так (схема из документации), но без шлюза ИЛИ.

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

Надеюсь это поможет.

person Greg Harley    schedule 03.02.2016
comment
Просто чтобы уточнить: эта функция не была удалена в Camunda, она, вероятно, была реализована в Activiti после того, как мы ее форкнули. (Я почти уверен, потому что изначально я внес поддержку сигналов в activiti до форка, и эта функция не входила в его состав). И да, это не соответствует BPMN, где сигналы всегда отправляются глобально. Но, тем не менее, эта функция кажется полезной, и ее следует очень просто реализовать. Я создал для него проблему в Camunda Jira: app.camunda.com/jira/browse/ CAM-5378 - person meyerdan; 05.02.2016

Когда-то у меня было аналогичное требование, но у меня не было ограничения без программирования на java, и мне пришлось использовать этот обходной путь, чтобы заставить его работать:

  • Создал сервисную задачу, разработанную на JAVA
  • В моей служебной задаче я сделал запрос задачи, чтобы получить задачу из другой ветки.
  • Запущен новый поток, чтобы принудительно завершить задачу (после некоторой задержки)

Он не был чистым, но работает нормально, и мой клиент доволен результатами.

person Younes Regaieg    schedule 03.02.2016