目录

  • 定义
  • 图形标记
  • XML内容
  • 使用示例
  • 视频教程


定义

事件子流程是 BPMN 2.0 中加入的新元素,它是指通过事件触发的子流程,可以存在于在流程
级别,或者任何子流程级别。和内嵌子流程类似,把一系列的活动归结到一起处理,不同之处在于
事件子流程不能直接启动,要被动地由其它的事件触发启动。事件子流程可以通过消息事件、错误
事件、信号事件、定时器事件或补偿事件等触发。

图形标记

事件子流程可以显示为边框为虚线的内嵌子流程,如图所示:

Flowable-子流程-事件子流程_工作流引擎

XML内容

事件子流程的 XML 内容与内嵌子流程是一样的,不同之处在于事件子流程需要把
triggeredByEvent 属性设置为 true:

<process id="mainProcess" name="主流程" isExecutable="true">
    <startEvent id="startEvent1"></startEvent>
     <subProcess id="subProcess" name="事件子流程" triggeredByEvent="true">
         <startEvent id="subProcessStart" />
         <endEvent id="subProcessEnd" />
     </subProcess>
 </process>

使用示例

用于触发事件子流程的事件,使用开始事件进行配置。因此可知,不能在事件子流程中使用空
启动事件,Flowable 支持的事件子流程中必须以错误开始事件或者消息开始事件开始。开始事件的
订阅在包含事件子流程的作用域(流程实例或子流程)创建时就会创建,当作用域销毁也会删除订
阅。事件子流程里面需要有结束节点。
事件子流程可以配置为中断或不中断的,中断的子流程会取消当前作用域内的所有执行,而非中
断的事件子流程将创建一个新的并行执行。中断事件子流程只会被作用域范围内的活动触发一次,
而非中断事件子流程可以多次触发。子流程是否是中断的,通过触发事件子流程的开始事件配置。
注意,Flowable 只支持中断事件子流程。
事件子流程不能有任何入口或出口顺序流。因为事件子流程是由事件触发的,入口顺序流是没
有意义的;当事件子流程结束时,要么当前作用域已经结束了(中断事件子流程的情况),要么是非中
断子流程创建的并行执行结束。
(一)事件子流程处于“流程级别”
如图所示是使用错误开始事件触发事件子流程的例子,主流程是一个扩容流程,用户申
请扩容后,由客服进行扩容操作,如果扩容成功,流程正常结束;如果扩容失败,流程异常结束,
抛出错误信号。事件子流程捕获到错误信号触发,由管理员进行扩容操作,该事件子流程处于“流
程级别”,即流程实例的范围。

事件子流程处于流程级别示例

Flowable-子流程-事件子流程_开发语言_02

XML文件内容

<error id="errorStart" errorCode="501" />
  <process id="EventSubProcess" name="子流程-事件子流程" isExecutable="true">
    <startEvent id="a176c794d61404eecad5499bef1ad0827" />
    <userTask id="acb02ce20ac3e4a759349bc6a27b83edf" name="报销申请">
      <extensionElements>
        <flowable:formData />
        <flowable:assigneeType>static</flowable:assigneeType>
      </extensionElements>
    </userTask>
    <sequenceFlow id="a3cf9d622e7f244e593daa3de4ea5cd28" sourceRef="a176c794d61404eecad5499bef1ad0827" targetRef="acb02ce20ac3e4a759349bc6a27b83edf" />
    <exclusiveGateway id="Gateway_01ldt0g" default="Flow_1qlsjb2" />
    <sequenceFlow id="Flow_0if2u86" sourceRef="acb02ce20ac3e4a759349bc6a27b83edf" targetRef="Gateway_01ldt0g" />
    <endEvent id="Event_0h4opqw" />
    <sequenceFlow id="Flow_1qlsjb2" sourceRef="Gateway_01ldt0g" targetRef="Event_0h4opqw" />
    <sequenceFlow id="Flow_125nv4v" name="部门预算不够" sourceRef="Gateway_01ldt0g" targetRef="Event_1vmolrd">
      <conditionExpression xsi:type="tFormalExpression">${flag == false}</conditionExpression>
    </sequenceFlow>
    <subProcess id="Activity_093jvyy" name="制定部门预算子流程" triggeredByEvent="true">
      <userTask id="Activity_0imaet9" name="重新制定部门预算">
        <extensionElements>
          <flowable:formData />
          <flowable:assigneeType>static</flowable:assigneeType>
        </extensionElements>
      </userTask>
      <sequenceFlow id="Flow_031n3ls" sourceRef="Event_1czfv34" targetRef="Activity_0imaet9" />
      <endEvent id="Event_1rizm83" />
      <sequenceFlow id="Flow_0ljilul" sourceRef="Activity_0imaet9" targetRef="Event_1rizm83" />
      <startEvent id="Event_1czfv34">
        <extensionElements>
          <flowable:formData />
        </extensionElements>
        <errorEventDefinition errorRef="errorStart" flowable:errorVariableLocalScope="false" flowable:errorVariableTransient="false" />
      </startEvent>
    </subProcess>
    <endEvent id="Event_1vmolrd">
      <errorEventDefinition errorRef="errorStart" flowable:errorVariableLocalScope="false" flowable:errorVariableTransient="false" />
    </endEvent>
  </process>

视频教程

事件子流程