Skip to content
本页目录

服务逻辑的场景分析

空函数

null

开始相当于函数入口,结束相当于函数中的返回 return

简单场景

执行单一任务

组件按顺序执行

null

定义文件如下:

xml
<bpmn:definitions>
  <bpmn:process id="Process_0o5azvg">
    <bpmn:startEvent id="StartEvent_0h92e5t" name="开始">
      <bpmn:outgoing>Flow_1hrlvke</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:task id="Activity_0ut80bs" name="执行">
      <bpmn:incoming>Flow_1hrlvke</bpmn:incoming>
      <bpmn:outgoing>Flow_0jawp3s</bpmn:outgoing>
    </bpmn:task>
    <bpmn:sequenceFlow id="Flow_1hrlvke" sourceRef="StartEvent_0h92e5t" targetRef="Activity_0ut80bs" />
    <bpmn:endEvent id="Event_1wwza08" name="结束">
      <bpmn:incoming>Flow_16k3adn</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_0jawp3s" sourceRef="Activity_0ut80bs" targetRef="Event_1wwza08" />
  </bpmn:process>
</bpmn:definitions>

顺序执行多个任务

组件按顺序执行

null

定义文件如下:

xml
<bpmn:definitions>
  <bpmn:process id="Process_0o5azvg">
    <bpmn:startEvent id="StartEvent_0h92e5t" name="开始">
      <bpmn:outgoing>Flow_1hrlvke</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:task id="Activity_0ut80bs" name="任务A">
      <bpmn:incoming>Flow_1hrlvke</bpmn:incoming>
      <bpmn:outgoing>Flow_0jawp3s</bpmn:outgoing>
    </bpmn:task>
    <bpmn:sequenceFlow id="Flow_1hrlvke" sourceRef="StartEvent_0h92e5t" targetRef="Activity_0ut80bs" />
    <bpmn:task id="Activity_19ny9kt" name="任务B">
      <bpmn:incoming>Flow_0jawp3s</bpmn:incoming>
      <bpmn:outgoing>Flow_16k3adn</bpmn:outgoing>
    </bpmn:task>
    <bpmn:sequenceFlow id="Flow_0jawp3s" sourceRef="Activity_0ut80bs" targetRef="Activity_19ny9kt" />
    <bpmn:endEvent id="Event_1wwza08" name="结束">
      <bpmn:incoming>Flow_16k3adn</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_16k3adn" sourceRef="Activity_19ny9kt" targetRef="Event_1wwza08" />
  </bpmn:process>
</bpmn:definitions>

条件判断场景

判断网关实现多选一

多个分支中选满足条件的第一个执行,可以使用判断(只有排他网关),选择第一个满足条件的分支,否则走默认分支

null

定义文件如下:

xml
<bpmn:definitions>
  <bpmn:process id="Process_0o5azvg">
    <bpmn:startEvent id="StartEvent_0h92e5t" name="开始">
      <bpmn:outgoing>Flow_1hrlvke</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:exclusiveGateway id="Gateway_17klwy6" default="Flow_1fi6i94">
      <bpmn:incoming>Flow_1hrlvke</bpmn:incoming>
      <bpmn:outgoing>Flow_19qufij</bpmn:outgoing>
      <bpmn:outgoing>Flow_07kt68m</bpmn:outgoing>
      <bpmn:outgoing>Flow_1fi6i94</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:sequenceFlow id="Flow_1hrlvke" sourceRef="StartEvent_0h92e5t" targetRef="Gateway_17klwy6" />
    <bpmn:task id="Activity_16ma9ja" name="任务A">
      <bpmn:incoming>Flow_19qufij</bpmn:incoming>
      <bpmn:outgoing>Flow_1e33aoq</bpmn:outgoing>
    </bpmn:task>
    <bpmn:sequenceFlow id="Flow_19qufij" name="条件A" expression="n < 0" sourceRef="Gateway_17klwy6" targetRef="Activity_16ma9ja" />
    <bpmn:task id="Activity_19ny9kt" name="任务B">
      <bpmn:incoming>Flow_07kt68m</bpmn:incoming>
      <bpmn:outgoing>Flow_16k3adn</bpmn:outgoing>
    </bpmn:task>
    <bpmn:sequenceFlow id="Flow_07kt68m" name="条件B" expression="n > 0" sourceRef="Gateway_17klwy6" targetRef="Activity_19ny9kt" />
    <bpmn:task id="Activity_1biclwc" name="任务C">
      <bpmn:incoming>Flow_1fi6i94</bpmn:incoming>
      <bpmn:outgoing>Flow_1uzhc4s</bpmn:outgoing>
    </bpmn:task>
    <bpmn:sequenceFlow id="Flow_1fi6i94" sourceRef="Gateway_17klwy6" targetRef="Activity_1biclwc" />
    <bpmn:endEvent id="Event_1wwza08" name="结束">
      <bpmn:incoming>Flow_16k3adn</bpmn:incoming>
      <bpmn:incoming>Flow_1e33aoq</bpmn:incoming>
      <bpmn:incoming>Flow_1uzhc4s</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_16k3adn" sourceRef="Activity_19ny9kt" targetRef="Event_1wwza08" />
    <bpmn:sequenceFlow id="Flow_1e33aoq" sourceRef="Activity_16ma9ja" targetRef="Event_1wwza08" />
    <bpmn:sequenceFlow id="Flow_1uzhc4s" sourceRef="Activity_1biclwc" targetRef="Event_1wwza08" />
  </bpmn:process>
</bpmn:definitions>

任务节点实现多选一

任务节点同样具备排他功能(此处与工作流不同),可简化排他网关,如下:

null

定义文件如下:

xml
<bpmn:definitions>
  <bpmn:process id="Process_0o5azvg">
    <bpmn:startEvent id="StartEvent_0h92e5t" name="开始">
      <bpmn:outgoing>Flow_1hrlvke</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:task id="Activity_0imgh20" name="前置任务" default="Flow_1fi6i94">
      <bpmn:incoming>Flow_1hrlvke</bpmn:incoming>
      <bpmn:outgoing>Flow_19qufij</bpmn:outgoing>
      <bpmn:outgoing>Flow_0fxb63v</bpmn:outgoing>
      <bpmn:outgoing>Flow_1fi6i94</bpmn:outgoing>
    </bpmn:task>
    <bpmn:sequenceFlow id="Flow_1hrlvke" sourceRef="StartEvent_0h92e5t" targetRef="Activity_0imgh20" />
    <bpmn:task id="Activity_16ma9ja" name="任务A">
      <bpmn:incoming>Flow_19qufij</bpmn:incoming>
      <bpmn:outgoing>Flow_1e33aoq</bpmn:outgoing>
    </bpmn:task>
    <bpmn:sequenceFlow id="Flow_19qufij" name="条件A" expression="n < 0" sourceRef="Activity_0imgh20" targetRef="Activity_16ma9ja">
      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"></bpmn:conditionExpression>
    </bpmn:sequenceFlow>
    <bpmn:task id="Activity_19ny9kt" name="任务B">
      <bpmn:incoming>Flow_0fxb63v</bpmn:incoming>
      <bpmn:outgoing>Flow_16k3adn</bpmn:outgoing>
    </bpmn:task>
    <bpmn:sequenceFlow id="Flow_0fxb63v" name="条件B" expression="n > 0" sourceRef="Activity_0imgh20" targetRef="Activity_19ny9kt">
      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"></bpmn:conditionExpression>
    </bpmn:sequenceFlow>
    <bpmn:task id="Activity_1biclwc" name="任务C">
      <bpmn:incoming>Flow_1fi6i94</bpmn:incoming>
      <bpmn:outgoing>Flow_1uzhc4s</bpmn:outgoing>
    </bpmn:task>
    <bpmn:sequenceFlow id="Flow_1fi6i94" sourceRef="Activity_0imgh20" targetRef="Activity_1biclwc" />
    <bpmn:endEvent id="Event_1wwza08" name="结束">
      <bpmn:incoming>Flow_16k3adn</bpmn:incoming>
      <bpmn:incoming>Flow_1e33aoq</bpmn:incoming>
      <bpmn:incoming>Flow_1uzhc4s</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_16k3adn" sourceRef="Activity_19ny9kt" targetRef="Event_1wwza08" />
    <bpmn:sequenceFlow id="Flow_1e33aoq" sourceRef="Activity_16ma9ja" targetRef="Event_1wwza08" />
    <bpmn:sequenceFlow id="Flow_1uzhc4s" sourceRef="Activity_1biclwc" targetRef="Event_1wwza08" />
  </bpmn:process>
</bpmn:definitions>

注意

此处需要考虑分支的顺序问题,图形化操作时需要能调整顺序(默认是按出口线的画制先后循序),控制好分支出口线的排序。

跳过任务

当满足任务跳过条件时,跳过任务

null

定义文件如下:

xml
<bpmn:definitions>
  <bpmn:process id="Process_0o5azvg">
    <bpmn:startEvent id="StartEvent_0h92e5t" name="开始">
      <bpmn:outgoing>Flow_1hrlvke</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:task id="Activity_0ut80bs" name="任务A" skipExpression="n > 0">
      <bpmn:incoming>Flow_1hrlvke</bpmn:incoming>
      <bpmn:outgoing>Flow_0jawp3s</bpmn:outgoing>
    </bpmn:task>
    <bpmn:sequenceFlow id="Flow_1hrlvke" sourceRef="StartEvent_0h92e5t" targetRef="Activity_0ut80bs" />
    <bpmn:task id="Activity_19ny9kt" name="任务B">
      <bpmn:incoming>Flow_0jawp3s</bpmn:incoming>
      <bpmn:outgoing>Flow_16k3adn</bpmn:outgoing>
    </bpmn:task>
    <bpmn:sequenceFlow id="Flow_0jawp3s" sourceRef="Activity_0ut80bs" targetRef="Activity_19ny9kt" />
    <bpmn:endEvent id="Event_1wwza08" name="结束">
      <bpmn:incoming>Flow_16k3adn</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_16k3adn" sourceRef="Activity_19ny9kt" targetRef="Event_1wwza08" />
  </bpmn:process>
</bpmn:definitions>

循环场景

集合循环

循环指定集合,对每个元素执行操作任务

null

定义文件如下:

xml
<bpmn:definitions>
  <bpmn:process id="Process_0vgeu4i">
    <bpmn:startEvent id="StartEvent_15ky1y0" name="开始">
      <bpmn:outgoing>Flow_10i3r5y</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:task id="Activity_0grfrj0" name="任务">
      <bpmn:incoming>Flow_10i3r5y</bpmn:incoming>
      <bpmn:outgoing>Flow_0hzmhtx</bpmn:outgoing>
      <bpmn:standardLoopCharacteristics collection="assigneeList" elementVariable="assignee"/>
    </bpmn:task>
    <bpmn:sequenceFlow id="Flow_10i3r5y" sourceRef="StartEvent_15ky1y0" targetRef="Activity_0grfrj0" />
    <bpmn:endEvent id="Event_1umj0di" name="结束">
      <bpmn:incoming>Flow_0hzmhtx</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_0hzmhtx" sourceRef="Activity_0grfrj0" targetRef="Event_1umj0di" />
  </bpmn:process>

终止循环

循环任务中,可以设置完成条件,满足条件后,循环终止

定义文件如下:

xml
<bpmn:definitions>
  <bpmn:process id="Process_0vgeu4i">
    <bpmn:startEvent id="StartEvent_15ky1y0" name="开始">
      <bpmn:outgoing>Flow_10i3r5y</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:task id="Activity_0grfrj0" name="任务">
      <bpmn:incoming>Flow_10i3r5y</bpmn:incoming>
      <bpmn:outgoing>Flow_0hzmhtx</bpmn:outgoing>
      <bpmn:standardLoopCharacteristics breakExpression="n > 10" collection="assigneeList" elementVariable="assignee"/>
    </bpmn:task>
    <bpmn:sequenceFlow id="Flow_10i3r5y" sourceRef="StartEvent_15ky1y0" targetRef="Activity_0grfrj0" />
    <bpmn:endEvent id="Event_1umj0di" name="结束">
      <bpmn:incoming>Flow_0hzmhtx</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_0hzmhtx" sourceRef="Activity_0grfrj0" targetRef="Event_1umj0di" />
  </bpmn:process>

方法调用

调用匿名方法

以子流程方式实现匿名方法,如下:

null

定义文件如下:

xml
<bpmn:definitions>
  <bpmn:process id="Process_18hzlor">
    <bpmn:startEvent id="Event_1gq9eno" name="开始">
      <bpmn:outgoing>Flow_0d1l36w</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:sequenceFlow id="Flow_0d1l36w" sourceRef="Event_1gq9eno" targetRef="Activity_14vx105" />
    <bpmn:subProcess id="Activity_14vx105" name="子流程">
      <bpmn:incoming>Flow_0d1l36w</bpmn:incoming>
      <bpmn:outgoing>Flow_0r7vef8</bpmn:outgoing>
      <bpmn:standardLoopCharacteristics />
      <bpmn:startEvent id="Event_0zbj31q" name="开始2">
        <bpmn:outgoing>Flow_1d8sc4g</bpmn:outgoing>
      </bpmn:startEvent>
      <bpmn:task id="Activity_02zi3mf" name="任务A">
        <bpmn:incoming>Flow_1d8sc4g</bpmn:incoming>
        <bpmn:outgoing>Flow_1htlfpf</bpmn:outgoing>
      </bpmn:task>
      <bpmn:sequenceFlow id="Flow_1d8sc4g" sourceRef="Event_0zbj31q" targetRef="Activity_02zi3mf" />
      <bpmn:endEvent id="Event_1ccvmkm" name="结束2">
        <bpmn:incoming>Flow_141mrxh</bpmn:incoming>
      </bpmn:endEvent>
      <bpmn:sequenceFlow id="Flow_1htlfpf" sourceRef="Activity_02zi3mf" targetRef="Activity_0ijgzrt" />
      <bpmn:task id="Activity_0ijgzrt" name="任务B">
        <bpmn:incoming>Flow_1htlfpf</bpmn:incoming>
        <bpmn:outgoing>Flow_141mrxh</bpmn:outgoing>
      </bpmn:task>
      <bpmn:sequenceFlow id="Flow_141mrxh" sourceRef="Activity_0ijgzrt" targetRef="Event_1ccvmkm" />
    </bpmn:subProcess>
    <bpmn:endEvent id="Event_1dagqet" name="结束">
      <bpmn:incoming>Flow_0r7vef8</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_0r7vef8" sourceRef="Activity_14vx105" targetRef="Event_1dagqet" />
  </bpmn:process>
</bpmn:definitions>

调用命名方法

以流程调用方式实现方法调用,如下:

null

此处流程B为定义的其他逻辑编排

定义文件如下:

xml
<bpmn:definitions>
  <bpmn:process id="Process_1nm0zpi" isExecutable="false">
    <bpmn:startEvent id="StartEvent_0h7wh9h" name="开始">
      <bpmn:outgoing>Flow_161ll1e</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:task id="Activity_0fu7p8j" name="前置任务">
      <bpmn:incoming>Flow_161ll1e</bpmn:incoming>
      <bpmn:outgoing>Flow_1pr5u44</bpmn:outgoing>
    </bpmn:task>
    <bpmn:sequenceFlow id="Flow_161ll1e" sourceRef="StartEvent_0h7wh9h" targetRef="Activity_0fu7p8j" />
    <bpmn:callActivity id="Activity_1id3qlm" name="方法调用" processCode="base">
      <bpmn:incoming>Flow_1pr5u44</bpmn:incoming>
      <bpmn:outgoing>Flow_1x9t8tn</bpmn:outgoing>
    </bpmn:callActivity>
    <bpmn:sequenceFlow id="Flow_1pr5u44" sourceRef="Activity_0fu7p8j" targetRef="Activity_1id3qlm" />
    <bpmn:endEvent id="Event_0a5s6ny" name="结束">
      <bpmn:incoming>Flow_1x9t8tn</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_1x9t8tn" sourceRef="Activity_1id3qlm" targetRef="Event_0a5s6ny" />
  </bpmn:process>
</bpmn:definitions>

异常处理

逻辑错误

逻辑错误区别于引擎执行过程中的异常,逻辑错误仅包含任务执行中的业务逻辑错误

null

定义文件如下:

xml
<bpmn:definitions>
  <bpmn:process id="Process_1c63ezc">
    <bpmn:startEvent id="StartEvent_01jxvrs" name="开始">
      <bpmn:outgoing>Flow_1yfxufl</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:sequenceFlow id="Flow_1yfxufl" sourceRef="StartEvent_01jxvrs" targetRef="Activity_0qhpn7l" />
    <bpmn:endEvent id="Event_08pd6vo" name="结束">
      <bpmn:incoming>Flow_18ougic</bpmn:incoming>
      <bpmn:incoming>Flow_0hw915o</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_18ougic" sourceRef="Activity_0qhpn7l" targetRef="Event_08pd6vo" />
    <bpmn:task id="Activity_0qhpn7l" name="任务A">
      <bpmn:incoming>Flow_1yfxufl</bpmn:incoming>
      <bpmn:outgoing>Flow_18ougic</bpmn:outgoing>
    </bpmn:task>
    <bpmn:boundaryEvent id="Event_1idhgz1" attachedToRef="Activity_0qhpn7l">
      <bpmn:outgoing>Flow_023a62z</bpmn:outgoing>
      <bpmn:errorEventDefinition id="ErrorEventDefinition_17xxrra" errorCode="err300"/>
    </bpmn:boundaryEvent>
    <bpmn:task id="Activity_1b6tx01" name="错误处理">
      <bpmn:incoming>Flow_023a62z</bpmn:incoming>
      <bpmn:outgoing>Flow_0hw915o</bpmn:outgoing>
    </bpmn:task>
    <bpmn:sequenceFlow id="Flow_023a62z" sourceRef="Event_1idhgz1" targetRef="Activity_1b6tx01" />
    <bpmn:sequenceFlow id="Flow_0hw915o" sourceRef="Activity_1b6tx01" targetRef="Event_08pd6vo" />
  </bpmn:process>
</bpmn:definitions>

超时

超时主要来源于任务执行时间过久,如API调用、数据查询等,所以超时由各任务自行处理实现,如果出现超时,则抛出异常即可。逻辑流中需要处理这种超时异常,通过错误边界处理实现。

null

抛出异常

执行取消结束事件时,会强制回滚所在事务。 数据库操作异常时,事务会自动回滚,但是异常被错误发生后,可以根据类型判断,处理是否需要回滚事务

null

定义文件如下:

xml
<bpmn:definitions>
  <bpmn:process id="Process_05b5hqi">
    <bpmn:startEvent id="StartEvent_0r74qm7" name="开始">
      <bpmn:outgoing>Flow_0eb9vdk</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:sequenceFlow id="Flow_0eb9vdk" sourceRef="StartEvent_0r74qm7" targetRef="Activity_1oa86dc" />
    <bpmn:transaction id="Activity_1oa86dc">
      <bpmn:incoming>Flow_0eb9vdk</bpmn:incoming>
      <bpmn:outgoing>Flow_0e4flec</bpmn:outgoing>
      <bpmn:startEvent id="Event_1azocc7" name="开始2">
        <bpmn:outgoing>Flow_05ttcrk</bpmn:outgoing>
      </bpmn:startEvent>
      <bpmn:task id="Activity_1md78p0" name="任务A">
        <bpmn:incoming>Flow_05ttcrk</bpmn:incoming>
        <bpmn:outgoing>Flow_0xof8nv</bpmn:outgoing>
      </bpmn:task>
      <bpmn:sequenceFlow id="Flow_05ttcrk" sourceRef="Event_1azocc7" targetRef="Activity_1md78p0" />
      <bpmn:exclusiveGateway id="Gateway_1wx87ly" default="Flow_1q1oa41">
        <bpmn:incoming>Flow_0xof8nv</bpmn:incoming>
        <bpmn:outgoing>Flow_1q1oa41</bpmn:outgoing>
        <bpmn:outgoing>Flow_02zkvm2</bpmn:outgoing>
      </bpmn:exclusiveGateway>
      <bpmn:sequenceFlow id="Flow_0xof8nv" sourceRef="Activity_1md78p0" targetRef="Gateway_1wx87ly" />
      <bpmn:endEvent id="Event_0sfdlyz" name="结束2">
        <bpmn:incoming>Flow_1q1oa41</bpmn:incoming>
      </bpmn:endEvent>
      <bpmn:sequenceFlow id="Flow_1q1oa41" name="业务成功" sourceRef="Gateway_1wx87ly" targetRef="Event_0sfdlyz" />
      <bpmn:sequenceFlow id="Flow_02zkvm2" name="失败,需要回滚" sourceRef="Gateway_1wx87ly" targetRef="Event_1nw1hnj" />
      <bpmn:endEvent id="Event_1nw1hnj" name="错误">
        <bpmn:incoming>Flow_02zkvm2</bpmn:incoming>
        <bpmn:errorEventDefinition  id="ErrorEventDefinition_1i9l2qx" />
      </bpmn:endEvent>
    </bpmn:transaction>
    <bpmn:endEvent id="Event_10gtnn8" name="结束">
      <bpmn:incoming>Flow_0e4flec</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_0e4flec" sourceRef="Activity_1oa86dc" targetRef="Event_10gtnn8" />
  </bpmn:process>
</bpmn:definitions>

避免死循环(堆栈溢出)

每个流程的节点(事件、网关、活动)都算一步执行,子流程、流程调用的执行数叠加到跟流程上,总执行步骤默认不可超过200步(可在流程上修改)

递归调用

递归在流程图中,可以视为调用父流程的模块,而子流程模块是无法直接和父流程的模块连线的,因此通过边界事件来实现,即通过升级结束事件 + 升级边界事件,实现递归配置

null

定义文件如下:

xml
<bpmn:definitions>
  <bpmn:process id="Process_1hgnj4b" isExecutable="false">
    <bpmn:startEvent id="StartEvent_0pzcz2o">
      <bpmn:outgoing>Flow_0997gbn</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:subProcess id="Activity_00f9wbl">
      <bpmn:incoming>Flow_0997gbn</bpmn:incoming>
      <bpmn:incoming>Flow_0pcnsxp</bpmn:incoming>
      <bpmn:outgoing>Flow_1s9pb17</bpmn:outgoing>
      <bpmn:startEvent id="Event_1ljnzmf">
        <bpmn:outgoing>Flow_1w4uqbp</bpmn:outgoing>
      </bpmn:startEvent>
      <bpmn:task id="Activity_18ikbg4" name="任务A">
        <bpmn:incoming>Flow_1w4uqbp</bpmn:incoming>
        <bpmn:outgoing>Flow_0qboz40</bpmn:outgoing>
      </bpmn:task>
      <bpmn:sequenceFlow id="Flow_1w4uqbp" sourceRef="Event_1ljnzmf" targetRef="Activity_18ikbg4" />
      <bpmn:sequenceFlow id="Flow_0qboz40" sourceRef="Activity_18ikbg4" targetRef="Event_0fw1n8d" />
      <bpmn:endEvent id="Event_0fw1n8d">
        <bpmn:incoming>Flow_0qboz40</bpmn:incoming>
        <bpmn:escalationEventDefinition id="EscalationEventDefinition_0174zv2" />
      </bpmn:endEvent>
    </bpmn:subProcess>
    <bpmn:sequenceFlow id="Flow_0997gbn" sourceRef="StartEvent_0pzcz2o" targetRef="Activity_00f9wbl" />
    <bpmn:sequenceFlow id="Flow_0pcnsxp" sourceRef="Event_1ufqi3q" targetRef="Activity_00f9wbl" />
    <bpmn:boundaryEvent id="Event_1ufqi3q" attachedToRef="Activity_00f9wbl">
      <bpmn:outgoing>Flow_0pcnsxp</bpmn:outgoing>
      <bpmn:escalationEventDefinition id="EscalationEventDefinition_0nb885g" />
    </bpmn:boundaryEvent>
    <bpmn:endEvent id="Event_1rhjo8z">
      <bpmn:incoming>Flow_1s9pb17</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_1s9pb17" sourceRef="Activity_00f9wbl" targetRef="Event_1rhjo8z" />
  </bpmn:process>
</bpmn:definitions>

树形数据遍历

深度优先遍历

null

定义文件如下:

xml
<bpmn:definitions>
  <bpmn:process id="Process_05b5hqi">
    <bpmn:startEvent id="StartEvent_0r74qm7" name="开始">
      <bpmn:outgoing>Flow_0eb9vdk</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:sequenceFlow id="Flow_0eb9vdk" sourceRef="StartEvent_0r74qm7" targetRef="Activity_1oa86dc" />
    <bpmn:endEvent id="Event_10gtnn8" name="结束">
      <bpmn:incoming>Flow_0e4flec</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_0e4flec" sourceRef="Activity_1oa86dc" targetRef="Event_10gtnn8" />
    <bpmn:subProcess id="Activity_1oa86dc">
      <bpmn:incoming>Flow_0eb9vdk</bpmn:incoming>
      <bpmn:incoming>Flow_0nhuuol</bpmn:incoming>
      <bpmn:outgoing>Flow_0e4flec</bpmn:outgoing>
      <bpmn:startEvent id="Event_1azocc7" name="开始2">
        <bpmn:outgoing>Flow_05ttcrk</bpmn:outgoing>
      </bpmn:startEvent>
      <bpmn:task id="Activity_1md78p0" name="任务A">
        <bpmn:incoming>Flow_05ttcrk</bpmn:incoming>
        <bpmn:outgoing>Flow_0xof8nv</bpmn:outgoing>
      </bpmn:task>
      <bpmn:exclusiveGateway id="Gateway_1wx87ly" default="Flow_1q1oa41">
        <bpmn:incoming>Flow_0xof8nv</bpmn:incoming>
        <bpmn:outgoing>Flow_1q1oa41</bpmn:outgoing>
        <bpmn:outgoing>Flow_02zkvm2</bpmn:outgoing>
      </bpmn:exclusiveGateway>
      <bpmn:endEvent id="Event_0sfdlyz" name="结束2">
        <bpmn:incoming>Flow_1q1oa41</bpmn:incoming>
      </bpmn:endEvent>
      <bpmn:sequenceFlow id="Flow_05ttcrk" sourceRef="Event_1azocc7" targetRef="Activity_1md78p0" />
      <bpmn:sequenceFlow id="Flow_0xof8nv" sourceRef="Activity_1md78p0" targetRef="Gateway_1wx87ly" />
      <bpmn:sequenceFlow id="Flow_1q1oa41" sourceRef="Gateway_1wx87ly" targetRef="Event_0sfdlyz" />
      <bpmn:sequenceFlow id="Flow_02zkvm2" name="有子节点" sourceRef="Gateway_1wx87ly" targetRef="Event_1nw1hnj" />
      <bpmn:endEvent id="Event_1nw1hnj" name="递归">
        <bpmn:incoming>Flow_02zkvm2</bpmn:incoming>
        <bpmn:escalationEventDefinition id="EscalationEventDefinition_1009517" />
      </bpmn:endEvent>
    </bpmn:subProcess>
    <bpmn:sequenceFlow id="Flow_0nhuuol" sourceRef="Event_0yvd5wr" targetRef="Activity_1oa86dc" />
    <bpmn:boundaryEvent id="Event_0yvd5wr" attachedToRef="Activity_1oa86dc">
      <bpmn:outgoing>Flow_0nhuuol</bpmn:outgoing>
      <bpmn:escalationEventDefinition id="EscalationEventDefinition_0dvjpal" />
    </bpmn:boundaryEvent>
  </bpmn:process>
</bpmn:definitions>

广度优先遍历

null

定义文件如下:

xml
<bpmn:definitions>
  <bpmn:process id="Process_05b5hqi">
    <bpmn:startEvent id="StartEvent_0r74qm7" name="开始">
      <bpmn:outgoing>Flow_0eb9vdk</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:sequenceFlow id="Flow_0eb9vdk" sourceRef="StartEvent_0r74qm7" targetRef="Activity_1oa86dc" />
    <bpmn:endEvent id="Event_10gtnn8" name="结束">
      <bpmn:incoming>Flow_0e4flec</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_0e4flec" sourceRef="Activity_1oa86dc" targetRef="Event_10gtnn8" />
    <bpmn:subProcess id="Activity_1oa86dc">
      <bpmn:incoming>Flow_0eb9vdk</bpmn:incoming>
      <bpmn:incoming>Flow_0nhuuol</bpmn:incoming>
      <bpmn:outgoing>Flow_0e4flec</bpmn:outgoing>
      <bpmn:standardLoopCharacteristics />
      <bpmn:startEvent id="Event_1azocc7" name="开始2">
        <bpmn:outgoing>Flow_05ttcrk</bpmn:outgoing>
      </bpmn:startEvent>
      <bpmn:task id="Activity_1md78p0" name="打印节点ID">
        <bpmn:incoming>Flow_05ttcrk</bpmn:incoming>
        <bpmn:outgoing>Flow_0xof8nv</bpmn:outgoing>
      </bpmn:task>
      <bpmn:exclusiveGateway id="Gateway_1wx87ly" default="Flow_1q1oa41">
        <bpmn:incoming>Flow_0xof8nv</bpmn:incoming>
        <bpmn:outgoing>Flow_1q1oa41</bpmn:outgoing>
        <bpmn:outgoing>Flow_02zkvm2</bpmn:outgoing>
      </bpmn:exclusiveGateway>
      <bpmn:endEvent id="Event_0sfdlyz" name="结束2">
        <bpmn:incoming>Flow_1q1oa41</bpmn:incoming>
        <bpmn:incoming>Flow_15v0ftb</bpmn:incoming>
      </bpmn:endEvent>
      <bpmn:sequenceFlow id="Flow_05ttcrk" sourceRef="Event_1azocc7" targetRef="Activity_1md78p0" />
      <bpmn:sequenceFlow id="Flow_0xof8nv" sourceRef="Activity_1md78p0" targetRef="Gateway_1wx87ly" />
      <bpmn:sequenceFlow id="Flow_1q1oa41" sourceRef="Gateway_1wx87ly" targetRef="Event_0sfdlyz" />
      <bpmn:sequenceFlow id="Flow_02zkvm2" name="有子节点" sourceRef="Gateway_1wx87ly" targetRef="Activity_1goq1ps" />
      <bpmn:task id="Activity_1goq1ps" name="子节点追加入循环队列">
        <bpmn:incoming>Flow_02zkvm2</bpmn:incoming>
        <bpmn:outgoing>Flow_15v0ftb</bpmn:outgoing>
      </bpmn:task>
      <bpmn:sequenceFlow id="Flow_15v0ftb" sourceRef="Activity_1goq1ps" targetRef="Event_0sfdlyz" />
    </bpmn:subProcess>
  </bpmn:process>
</bpmn:definitions>

事务

无事务

逻辑编排默认不启用事务

局部事务

逻辑编排流程中,局部区域需要事务管理的,采用事务子流程。事务区域内,如果出现两个数据源,则需要使用JTA事务,否则使用本地事务即可。

每个局部事务都是新建,不与父流程共享事务;如需共享,子流程不能启用事务。

全局事务

整个逻辑编排流程也可以启用事务,同局部事务,只是范围是整个逻辑编排

调用子流程时事务问题

每个流程可以设置是否启用事务,当启用事务的流程,被当做子流程调用时,调用节点上可设置子流程是否使用独立事务。

内嵌事务

任务(持续增加)

关系型数据库处理(SQL执行)

执行SQL语句,操作数据库

工具类

集合过滤

以任务方式,实现指定集合的过滤。

内部资料,请勿外传