如何使用activiti bpmn完成第二项任务?

时间:2016-11-23 07:58:42

标签: java alfresco activiti bpmn

并行启动了2个任务:ManagerReviewTaskDirectorReviewTask

当:

  • DirectorReviewTask先完成,ManagerReviewTask也应该完成(以编程方式)。
  • ManagerReviewTask先完成,工作流程应等到指定用户完成DirectorReviewTask

我该怎么做?你能举一个例子来说明activiti xml吗?

3 个答案:

答案 0 :(得分:2)

一种相当标准的模式。标准的包含网关和要取消的信号。

enter image description here

答案 1 :(得分:1)

这是我向DirectorReviewTask添加听众并完成ManagerReviewTask的方式。

<userTask id="DirectorReviewTask" name="DirectorReviewTask">
    <extensionElements>
        <activiti:taskListener event="complete" class="listeners.DirectorReviewTaskListener"/>
    </extensionElements>
</userTask>

这里是listner类:

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 :(得分:1)

从BPMN的角度来看,您有可能选择:

  1. 在DirectorReviewTask之后(或作为它的结束事件)添加发送信号(假设为stopManagerReviewTask)。在ManagerReviewTask上,您需要将stopManagerReviewTask的处理添加为边界中断信号事件。
  2. 如果DirectorReviewTask是流程中的最后一个操作,则以End ends事件结束包含DirectorReviewTask的流程。
  3. 在案例1中,您只需要考虑如何强制activiti从同一进程中仅停止一个DirectorReviewTask,而不是并行运行所有实例。