【问题标题】:Viewflow Process won't exit cleanly with split-n-join tasks?Viewflow Process 不会通过 split-n-join 任务干净地退出?
【发布时间】:2018-05-21 21:09:49
【问题描述】:

假设我有一个流程,其中有两个可选的查看任务要完成:

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

假设两个任务都已分配,但有人登录并完成了 optional_view_1。 Join 本身和 End 节点都以 DONE 状态结束。但是,由于 optional_view_2,进程会卡住并且不会干净地退出。

问题是:

  • 如何干净利落地完成这个过程(即不取消它)并且没有比赛
  • 从哪里(例如,在每个视图之后从 Join 或 Handler 内部取消另一个?)

我最初posted this as an issue,以及一个可能的编码解决方案。总结一下代码:

  1. 覆盖与加入关联的“完成”激活
  2. 覆盖检查 Join 是否具有 wait_all=False
  3. 如果是,则尝试查找 Join 正在等待的任何其他任务
  4. 并取消它们

第 3 步的代码是我最担心的一点。它是 Viewflow code handling the wait_all=True case 的修改版本,总结如下:

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)

欢迎任何关于这是否正确的方法。

【问题讨论】:

    标签: django-viewflow


    【解决方案1】:

    BPMN 流程不会是完整的,这是正确的行为。加入传出路径将被执行两次。

    要拥有可选分支,您需要实现基于事件的网关。这将订阅流任务结束信号(覆盖就绪方法)并取消未完成的任务。

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

    【讨论】:

    • 您注意到加入传出路径将被执行两次。我假设每次上游任务完成并“命中”加入时都会发生这种情况。如果这是一个正确的理解,我不清楚设置 wait_all=False 的含义......你能澄清一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    相关资源
    最近更新 更多