Процесс потока не завершится чисто с задачами split-n-join? - PullRequest
0 голосов
/ 22 мая 2018

Скажем, у меня есть Процесс, в котором есть две необязательные задачи View до конца:

--> Split --> optional_view_1 ---> Join ----> finish
       |                            ^
       |                            |
       -----> optional_view_2 -------

Допустим, обе задачи назначены, но человек входит в систему и завершает option_view_1.Само соединение и, действительно, конечный узел имеют статус DONE.Тем не менее, процесс застревает и НЕ завершается чисто из-за option_view_2.

Вопросы:

  • как завершить процесс чисто (т.е. не отменять его) и без гонок
  • откуда (например, из соединения илиОбработчик после каждого просмотра отменяет другой?)

Первоначально я опубликовал это как проблему вместе с возможным кодированным решением.Таким образом, код:

  1. Переопределяет активацию "выполнено", связанную с объединением
  2. Переопределение проверяет, имеет ли объединение wait_all = False
  3. И если так,пытается найти любые другие задачи, которые объединение ожидает
  4. и отменяет их

Код для шага 3 - это бит, который меня больше всего беспокоит.Это модифицированная версия кода Viewflow , обрабатывающая регистр wait_all = True , и выглядит примерно так:

previous = self.task.previous.exclude(status=STATUS.CANCELED).all()
join_prefixes = set(prev.token.get_common_split_prefix(self.task.token, prev.pk)
                    for prev in previous)
#
# Don't forget to exclude the previous tasks.
#
join_token_prefix = next(iter(join_prefixes))
active = self.flow_class.task_class._default_manager \
    .filter(process=self.process, token__startswith=join_token_prefix) \
    .exclude(status__in=[STATUS.DONE, STATUS.CANCELED], pk__in=[prev.pk for prev in previous])
 for task in active:
     cancel_task(task)

Любые комментарии о том, правильный ли это подход или нет, будутприветствуется.

1 Ответ

0 голосов
/ 22 мая 2018

Этот BPMN-процесс не будет завершен, это правильное поведение.Исходящий путь соединения будет выполнен дважды.

Чтобы иметь необязательную ветвь, вам необходимо реализовать шлюз на основе событий.Это подписалось бы на сигнал окончания задачи потока (метод переопределения готовности) и отменило бы незавершенные задачи.

https://www.youtube.com/watch?v=pyJM_V8Ji2w

...