关键词:flowable 事件子流程,flowable event sub processes,flowable isInterrupting
上文详细讲解了非中断子流程的新特性,本文重点讲解如何使用flowable提供的非中断子流程。本文的讲解均是围绕subProcess元素中的isInterrupting属性进行讲解。
1.1 流程图
首先定义一个流程如下图所示:
1.2 流程文档内容
上述的流程文档部分XML信息如下:
<subProcess id="eventSubProcess" name="subProcess" triggeredByEvent="true">
<startEvent id="subEventStartEvent" isInterrupting="true">
<messageEventDefinition messageRef="startAnotherSubTask"></messageEventDefinition>
</startEvent>
<userTask id="additionalSubTask" name="Additional sub task" flowable:assignee="$INITIATOR">
<extensionElements>
<modeler:activiti-idm-initiator xmlns:modeler="http://flowable.org/modeler"><![CDATA[true]]></modeler:activiti-idm-initiator>
</extensionElements>
</userTask>
<endEvent id="subEventEndEvent"></endEvent>
<sequenceFlow id="subEventFlow1" sourceRef="subEventStartEvent" targetRef="additionalSubTask"></sequenceFlow>
<sequenceFlow id="subEventFlow2" sourceRef="additionalSubTask" targetRef="subEventEndEvent"></sequenceFlow>
</subProcess>
<sequenceFlow id="subFlow2" sourceRef="subTask1" targetRef="subEndEvent"></sequenceFlow>
<sequenceFlow id="subFlow1" sourceRef="subStartEvent" targetRef="subTask1"></sequenceFlow>
</subProcess>
1.3 测试
测试代码如下:
@Deployment(resources="MessageEventSubprocessTest.testStartingAdditionalTasks.bpmn20.xml")
public void testStartingAdditionalTasksNoNestedEventSubProcess() {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("startingAdditionalTasks");
assertEquals(3, runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).count());
Execution execution = runtimeService.createExecutionQuery()
.processInstanceId(processInstance.getId())
.messageEventSubscriptionName("Start another task")
.singleResult();
assertNotNull(execution);
assertEquals(1, taskService.createTaskQuery().count());
assertEquals(1, createEventSubscriptionQuery().count());
Task task = taskService.createTaskQuery().taskDefinitionKey("task1").singleResult();
taskService.complete(task.getId());
assertEquals(2, createEventSubscriptionQuery().count());
assertEquals(1, taskService.createTaskQuery().count());
task = taskService.createTaskQuery().taskDefinitionKey("subTask1").singleResult();
taskService.complete(task.getId());
assertEquals(1, createEventSubscriptionQuery().count());
assertEquals(1, taskService.createTaskQuery().count());
task = taskService.createTaskQuery().taskDefinitionKey("task2").singleResult();
taskService.complete(task.getId());
assertEquals(0, runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).count());
}
1.4 总结
子流程中可以通过isInterrupting属性设置是否是中断事件。任务处理人的设置也可以通过modeler:activiti-idm-initiator标签进行设置,关于这一点可以参考随后的文章。
转载请注明:分享牛 » flowable 非中断子流程实战