盘古BPM体验地址    盘古BPM交流群盘古BPM交流群号:963222735

flowable 非中断子流程实战

分享牛 4943℃

关键词: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 非中断子流程实战