Reputation: 33544
There are 2 task started in parallel: ManagerReviewTask
and DirectorReviewTask
.
When:
DirectorReviewTask
finished first, ManagerReviewTask
should be finished too (programatically).ManagerReviewTask
finished first, workflow should wait until DirectorReviewTask
is finished by assigned user.How do I do that? Could you please provide an example with activiti xml?
Upvotes: 2
Views: 1463
Reputation: 3240
A rather standard pattern. A standard inclusive gateway and a signal to cancel.
Upvotes: 2
Reputation: 6318
From BPMN perspective you have to possibilities to choose from:
In case 1 you only need to consider how to force activiti to stop only one DirectorReviewTask from the same process not all instances running in parallel.
Upvotes: 1
Reputation: 8100
This is how I would add a listener to DirectorReviewTask
and finish ManagerReviewTask
.
<userTask id="DirectorReviewTask" name="DirectorReviewTask">
<extensionElements>
<activiti:taskListener event="complete" class="listeners.DirectorReviewTaskListener"/>
</extensionElements>
</userTask>
Here the listner class:
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());
}
}
}
}
I think you should end up with a parallel gateway:
<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" />
Upvotes: 2