Flowable-子流程-事件子流程

✨✨✨ 最好用的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流程的使用方法 #### 创建嵌套流程定义 在 Flowable 中,可以通过 BPMN 图形化编辑工具或 XML 定义来创建带有流程工作流模型。对于流程而言,在父流程中可以将其视为一个单独的任务节点,该节点内部又包含了多个活动。 ```xml <process id="parentProcess" name="Parent Process"> <!-- ... --> <subProcess id="embeddedSubprocess" name="Embedded Sub-process"> <startEvent id="innerStart"/> <sequenceFlow id="flow1" sourceRef="innerStart" targetRef="taskInSubprocess"/> <userTask id="taskInSubprocess" name="User Task In Subprocess"></userTask> <endEvent id="innerEnd"/> </subProcess> <!-- ... --> </process> ``` 上述代码展示了如何在一个父进程中定义内嵌式的进程[^1]。 #### 调用外部已存在的流程 除了直接在当前流程文件里声明流程外,还可以通过 `callActivity` 来调用预先已经部署好的另一个独立 BPNM 流程作为流程执行: ```xml <process id="mainProcess" name="Main Process"> <!-- Other elements --> <callActivity id="calledChildProcess" calledElement="childProcessId"/> <!-- More elements --> </process> ``` 这里的关键在于设置属性 `calledElement` 的值为要被调用的目标流程 ID 或者 key 值[^2]。 #### 处理流程中的变量传递 当涉及到父流程间的数据交换时,通常会利用输入输出参数映射机制来进行数据共享。这允许开发者指定哪些局部变量应该从父级传入到级别以及反过来的情况。 ```java // 设置调用流程前后的变量操作逻辑 Map<String, Object> variables = new HashMap<>(); variables.put("inputVariable", "someValue"); runtimeService.startProcessInstanceByKey( "mainProcessKey", variables); // 获取完成之后的结果 ProcessInstance pi = runtimeService.createProcessInstanceQuery() .processInstanceId(processInstanceId) .singleResult(); if (pi != null && !pi.isEnded()) { // 进一步处理... } ``` 这段 Java 代码片段说明了怎样向新启动的过程实例注入初始变量集合,并查询特定过程的状态以获取最终结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小学生05101

flowable

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

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

打赏作者

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

抵扣说明:

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

余额充值