Viewflow Process 不会通过 split-n-join 任务干净地退出?
Viewflow Process won't exit cleanly with split-n-join tasks?
假设我有一个进程有两个可选的 View 任务要完成:
--> Split --> optional_view_1 ---> Join ----> finish
| ^
| |
-----> optional_view_2 -------
假设两个任务都已分配,但是一个人登录并完成了 optional_view_1。 Join 本身和 End 节点都以 DONE 状态结束。但是,由于 optional_view_2,该进程将卡住并且不会干净地退出。
问题是:
- 如何干净利落地完成这个过程(即不取消它)并且没有比赛
- 从哪里(例如,从每个视图之后的 Join 或处理程序中取消另一个视图?)
我最初是 posted this as an issue,以及一个可能的编码解决方案。总结代码:
- 覆盖与加入
关联的激活"done"
- 覆盖检查 Join 是否有 wait_all=False
- 如果是,则尝试查找 Join 正在等待的任何其他任务
- 并取消它们
第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)
欢迎就此方法是否正确提出任何意见。
BPMN 流程不会完成,这是正确的行为。加入传出路径将执行两次。
要有可选分支,您需要实现基于事件的网关。这将订阅流任务结束信号(覆盖就绪方法)并取消未完成的任务。
假设我有一个进程有两个可选的 View 任务要完成:
--> Split --> optional_view_1 ---> Join ----> finish
| ^
| |
-----> optional_view_2 -------
假设两个任务都已分配,但是一个人登录并完成了 optional_view_1。 Join 本身和 End 节点都以 DONE 状态结束。但是,由于 optional_view_2,该进程将卡住并且不会干净地退出。
问题是:
- 如何干净利落地完成这个过程(即不取消它)并且没有比赛
- 从哪里(例如,从每个视图之后的 Join 或处理程序中取消另一个视图?)
我最初是 posted this as an issue,以及一个可能的编码解决方案。总结代码:
- 覆盖与加入 关联的激活"done"
- 覆盖检查 Join 是否有 wait_all=False
- 如果是,则尝试查找 Join 正在等待的任何其他任务
- 并取消它们
第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)
欢迎就此方法是否正确提出任何意见。
BPMN 流程不会完成,这是正确的行为。加入传出路径将执行两次。
要有可选分支,您需要实现基于事件的网关。这将订阅流任务结束信号(覆盖就绪方法)并取消未完成的任务。