使用拆分连接任务,Viewflow Process不会完全退出?

时间:2018-05-21 21:09:49

标签: django-viewflow

假设我有一个Process,它有两个可选的View任务到完成:

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

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

问题是:

  • 如何干净地完成整个过程(即不取消它)并且没有比赛
  • 从哪里(例如从每个View之后的Join或Handler中取消另一个?)

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

  1. 覆盖与“加入”
  2. 关联的激活“已完成”
  3. 覆盖检查Join是否具有wait_all = False
  4. 如果是这样,试图找到Join等待的其他任务
  5. 取消他们
  6. 第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)
    

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

1 个答案:

答案 0 :(得分:1)

BPMN流程不完整,这是正确的行为。连接传出路径将执行两次。

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

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