Activiti: приостановка задачи для введения альтернативного потока и ее повторное возобновление

#activiti

#activiti

Вопрос:

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

start-event -> user-task-A -> user-task-B -> end-event

Как показано, за user-task-A следует user-task-B по завершении.

Мне нужно изменить его в соответствии с требованием, в соответствии с которым пользователь, работающий над user-task-A, может приостановить его, потому что у него / нее есть некоторые запросы к нему. Если это произойдет, то user-task-B не будет создаваться, а вместо этого должна быть создана новая задача пользователя для разрешения этих запросов. И когда на эти запросы будут даны ответы, пользовательская задача-A должна быть восстановлена, и следует обычный курс.

Я понимаю, что пользовательские задачи в activiti не могут быть приостановлены. Весь процесс должен быть приостановлен.

Как я могу этого добиться?

Ответ №1:

Ну, вы можете достичь этого, смоделировав это требование в бизнес-процессе:

 start -> user-task-A -> exclusive gateway (is task done?) 
                          -> yes -> user-task-B
                          -> no -> sub process for answering queries 
                                     -> go back to user-task-A
  

Комментарии:

1. Спасибо за входные данные. У меня есть запрос здесь. Не нужно ли нам выполнить user-task-A, чтобы активировать эксклюзивное решение шлюза? И если да, то это означает, что мы не можем вернуться к user-task-A как завершенному.

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

Ответ №2:

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

Этот подход упрощает модель и позволяет вам поддерживать каждый из фрагментов независимо (что-то вроде модульности с согласованным интерфейсом).

Комментарии:

1. «Когда мне нужно включить фрагменты встроенного процесса»… не могли бы вы, пожалуйста, объяснить это немного подробнее?

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

3. Manroid, рассмотрите сценарий: task1 -> Task2 -> Task3 -> Task2a -> task2b -> Task3 Task2 и Task2a / Task2b являются независимыми процессами с согласованным интерфейсом (ввод и вывод переменных). Вы можете выборочно вызывать любой из этих потоков как динамический подпроцесс, через эксклюзивный шлюз, через шлюз событий или с использованием сигналов. У всех есть свои преимущества и недостатки в зависимости от сценария. С помощью сигналов каждый из подпотоков (фрагментов) имеет событие запуска сигнала и отправляет завершенный сигнал для освобождения родительского потока.