【问题标题】:How to finish a second task with activiti bpmn?如何用activiti bpmn完成第二个任务?
【发布时间】:2016-11-23 07:58:41
【问题描述】:
有 2 个任务并行启动:ManagerReviewTask 和 DirectorReviewTask。
时间:
-
DirectorReviewTask 先完成,ManagerReviewTask 也应该完成(以编程方式)。
-
ManagerReviewTask 先完成,工作流应该等到分配的用户完成 DirectorReviewTask。
我该怎么做?你能提供一个activiti xml的例子吗?
【问题讨论】:
标签:
java
alfresco
activiti
bpmn
【解决方案1】:
这就是我向DirectorReviewTask 添加监听器并完成ManagerReviewTask 的方式。
<userTask id="DirectorReviewTask" name="DirectorReviewTask">
<extensionElements>
<activiti:taskListener event="complete" class="listeners.DirectorReviewTaskListener"/>
</extensionElements>
</userTask>
这里是监听类:
public class DirectorReviewTaskListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
if (TaskListener.EVENTNAME_COMPLETE.equals(delegateTask.getEventName())) {
String executionId = delegateTask.getExecutionId();
Task managerReviewTask = taskService.createTaskQuery().executionId(executionId).taskName("ManagerReviewTask").singleResult();
if (managerReviewTask != null) {
taskService.complete(managerReviewTask.getId());
}
}
}
}
我认为你应该最终得到一个并行网关:
<parallelGateway id="fork" />
<sequenceFlow sourceRef="fork" targetRef="ManagerReviewTask" />
<sequenceFlow sourceRef="fork" targetRef="DirectorReviewTask" />
<userTask id="ManagerReviewTask" name="ManagerReviewTask" />
<sequenceFlow sourceRef="ManagerReviewTask" targetRef="join" />
<userTask id="DirectorReviewTask" name="DirectorReviewTask">
<extensionElements>
<activiti:taskListener event="complete" class="listeners.DirectorReviewTaskListener"/>
</extensionElements>
</userTask>
<sequenceFlow sourceRef="DirectorReviewTask" targetRef="join" />
<parallelGateway id="join" />
<sequenceFlow sourceRef="join" targetRef="GO_FROM_HERE" />
【解决方案2】:
相当标准的模式。一个标准的包容性网关和一个取消信号。
【解决方案3】:
从 BPMN 的角度来看,您有多种选择:
- 在 DirectorReviewTask(或作为它的结束事件)之后添加发送信号(比如说 stopManagerReviewTask)。在 ManagerReviewTask 上,您需要将 stopManagerReviewTask 的处理添加为边界中断信号事件。
- 如果 DirectorReviewTask 是流程中的最后一个操作,则使用 End terminate 事件结束包含 DirectorReviewTask 的流程。
在情况 1 中,您只需要考虑如何强制 activiti 仅停止同一进程中的一个 DirectorReviewTask,而不是所有实例并行运行。