Flowable-子流程-事件子流程

本文详细介绍了BPMN2.0中的事件子流程,包括其定义、图形表示、XML配置示例,以及如何通过开始事件触发,强调了中断和非中断子流程的区别。实例演示了如何使用错误开始事件来触发事件子流程,涉及Activiti流程引擎的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

✨✨✨ 最好用的Flowable流程设计器


定义

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

图形标记

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

在这里插入图片描述

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 只支持中断事件子流程。
事件子流程不能有任何入口或出口顺序流。因为事件子流程是由事件触发的,入口顺序流是没
有意义的;当事件子流程结束时,要么当前作用域已经结束了(中断事件子流程的情况),要么是非中
断子流程创建的并行执行结束。
(一)事件子流程处于“流程级别”
如图所示是使用错误开始事件触发事件子流程的例子,主流程是一个扩容流程,用户申
请扩容后,由客服进行扩容操作,如果扩容成功,流程正常结束;如果扩容失败,流程异常结束,
抛出错误信号。事件子流程捕获到错误信号触发,由管理员进行扩容操作,该事件子流程处于“流
程级别”,即流程实例的范围。

事件子流程处于流程级别示例
在这里插入图片描述

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>

视频教程

事件子流程

演示demo

事件子流程

本文中内容和案例出自贺波老师的书《深入Activiti流程引擎:核心原理与高阶实战》,书中的介绍更全面、详细,推荐给大家。
深入Activiti流程引擎

Flowable(Activiti)中,要创建一个支持多个部门并行办理的流程实例,你需要在XML流程定义文件中设计流程图,并使用并行_gateway(Parallel Gateway)来允许任务在不同的分支上同时进行。这里是一个简单的示例: ```xml <process id="multiDepartmentProcess" name="多部门并行处理流程"> <startEvent id="startEvent"/> <!-- 部门A的任务 --> <sequenceFlow id="flowToDeptA" sourceRef="startEvent" targetRef="task Dept A"/> <userTask id="task Dept A" name="部门A任务" assigneeExpression="#{user.department == '部门A'}"/> <!-- 部门B的任务 --> <sequenceFlow id="flowToDeptB" sourceRef="startEvent" targetRef="task Dept B"/> <userTask id="task Dept B" name="部门B任务" assigneeExpression="#{user.department == '部门B'}"/> <!-- 并行 gateway --> <parallelGateway id="parallelGateway"/> <!-- 各部门任务结束后的网关 --> <inclusiveGateway id="endParallelGateway"/> <!-- 连接到部门A和部门B任务完成后的路径 --> <sequenceFlow id="flowFromDeptA" sourceRef="task Dept A" targetRef="endParallelGateway"/> <sequenceFlow id="flowFromDeptB" sourceRef="task Dept B" targetRef="endParallelGateway"/> <!-- 结束流程 --> <endEvent id="endEvent" outgoing="endParallelGateway"/> </process> ``` 在这个例中,`startEvent`开始,然后流程会根据用户属性(假设存储在`user`变量中)的不同部门分别进入`task Dept A`和`task Dept B`。当两个部门的任务都完成后,流程会通过`inclusiveGateway`合并,最后到达`endEvent`结束。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学生05101

flowable

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值