Flowable中间事件-中间信号捕获事件

信号中间事件包括信号中间捕获事件和信号中间抛出事件,用于流程的同步和通信。当流程执行到捕获事件时会暂停等待信号,而抛出事件则会发出信号触发其他订阅了同一信号的事件。这种机制允许跨流程实例的通信,并且信号不会在被捕获后被消耗。在费用报销的示例中,业务流程通过信号事件协调不同审批步骤,实现流程的并行和同步。

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


定义

信号中间事件分为 Catching 事件和 Throwing 事件,即信号中间捕获事件(Signal Intermediate
Catch Event)和信号中间抛出事件(Signal Intermediate Throwing Event)。
当流程执行到信号中间捕获事件时就会中断在这里,一直等待被触发,直接到该事件接收到相
应的信号后,流程沿后继路线继续执行。信号事件是全局的,与其他事件(比如错误事件)不同,
信号不会在捕获之后被消费。如果存在多个引用了相同信号的事件被激活,即使它们不在同一个流
程实例中,那么当接收到信号时,这些事件被一并被触发。
当流程执行到达信号抛出事件时,流程引擎会直接抛出信号,其他引用了与其相同的信号捕获
事件会被触发,信号发出后事件结束,流程沿后继路线继续执行。其抛出的信号可以被信号开始事
件(Signal Start Event)、信号中间捕获事件(Signal Intermediate Catch Event)、信号边界事件(Signal
Boundary Interrputing Event)订阅处理。

图形标记

信号中间捕获事件显示为一个普通的中间事件(圆圈套圆圈),内部有一个信号小图标。信号
小图标是白色的(无填充),表示捕获语义,如图所示:
在这里插入图片描述

XML内容

信号中间捕获事件
信号中间事件定义为普通的中间捕获事件。对应类型的子元素是 signalEventDefinition 元素:

  <signal id="theSignal" name="The Signal" />
  <process id="signalIntermediateCatchEventProcess">
      <intermediateCatchEvent id="signal">
        <signalEventDefinition signalRef="theSignal" />
      </intermediateCatchEvent>
  </process>

在以上 xml 代码片段中,加粗的部分分别定义了 signal 和 intermediateCatchEvent,信号 signal
的 id 属性值为 theSignal,信号中间捕获事件 intermediateCatchEvent 中的 signalEventDefinition 子元
素通过设置 signalRef 为 theSignal 引用了该信号。
信号中间捕获事件触发的方式有两种:
1、流程中抛出信号事件(Signal Intermediate Throwing Event)、信号结束事件(Signal End
Event)发出的信号。
2、通过 API 触发,在 Flowable 中通过调用 runtimeService.signalEventReceived 系列方法发出一
个指定的信号,参考信号边界事件中的介绍。

使用示例

下面看一个费用报销的例子,同时利用了信号中间捕获事件和信号中间抛出事件。发起流程提
交报销申请后,后续有三个并行分支,一个分支会进业务主管确认,另外两个分支都分别到达信号
中间捕获事件,这两个事件会一直等待信号,当业务主管确认完成后到达后续的信号中间抛出事件
发出信号,从而触发两个信号中间捕获事件使另两个分支分别推进至部门主管审批节点和财务主管
节点。该流程的流程图如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r7fAdIfR-1690634246529)(…/public/images/intermediate-catch-event/signal-intermediate-catch-event-01.png)]

示例XML内容

<signal id="theSignal" name="信号" flowable:scope="global" />
  <process id="SignalIntermediateCatchingEvent" name="中间信号捕获和抛出事件测试" isExecutable="true">
    <startEvent id="aed01518ca37e4c5b820abada9e7edc17" />
    <userTask id="aded12dde53c444b9b7a8a99d265b7b2d" name="付款申请">
      <extensionElements>
        <flowable:formData />
        <flowable:assigneeType>static</flowable:assigneeType>
      </extensionElements>
    </userTask>
    <sequenceFlow id="a273f2adba0ac45f1acbff9d4d821de61" sourceRef="aed01518ca37e4c5b820abada9e7edc17" targetRef="aded12dde53c444b9b7a8a99d265b7b2d" />
    <sequenceFlow id="Flow_1sfqb6b" sourceRef="aded12dde53c444b9b7a8a99d265b7b2d" targetRef="Gateway_0ef4904" />
    <parallelGateway id="Gateway_0ef4904" />
    <sequenceFlow id="Flow_0ituttz" sourceRef="Gateway_0ef4904" targetRef="Event_0374yen" />
    <intermediateCatchEvent id="Event_0374yen">
      <signalEventDefinition signalRef="theSignal" />
    </intermediateCatchEvent>
    <userTask id="Activity_0hbesbz" name="部门主管审批">
      <extensionElements>
        <flowable:formData />
        <flowable:assigneeType>static</flowable:assigneeType>
      </extensionElements>
    </userTask>
    <sequenceFlow id="Flow_0ypus8y" sourceRef="Event_0374yen" targetRef="Activity_0hbesbz" />
    <sequenceFlow id="Flow_00epdwi" sourceRef="Gateway_0ef4904" targetRef="Event_1mpvo0c" />
    <userTask id="Activity_1mf7r17" name="财务主管审批">
      <extensionElements>
        <flowable:assigneeType>static</flowable:assigneeType>
        <flowable:formData />
      </extensionElements>
    </userTask>
    <sequenceFlow id="Flow_1eni8ec" sourceRef="Event_1mpvo0c" targetRef="Activity_1mf7r17" />
    <sequenceFlow id="Flow_0vg3vj4" sourceRef="Gateway_0ef4904" targetRef="Activity_18sdoo1" />
    <userTask id="Activity_18sdoo1" name="业务主管确认">
      <extensionElements>
        <flowable:formData />
        <flowable:assigneeType>static</flowable:assigneeType>
      </extensionElements>
    </userTask>
    <sequenceFlow id="Flow_0yffw90" sourceRef="Activity_0hbesbz" targetRef="Gateway_1ss0n3z" />
    <parallelGateway id="Gateway_1ss0n3z" />
    <sequenceFlow id="Flow_1jg3xvu" sourceRef="Activity_1mf7r17" targetRef="Gateway_1ss0n3z" />
    <userTask id="Activity_153vvhu" name="财务打款">
      <extensionElements>
        <flowable:assigneeType>static</flowable:assigneeType>
        <flowable:formData />
      </extensionElements>
    </userTask>
    <sequenceFlow id="Flow_15cmtof" sourceRef="Gateway_1ss0n3z" targetRef="Activity_153vvhu" />
    <endEvent id="Event_1a1foyk" />
    <sequenceFlow id="Flow_0aj4r74" sourceRef="Activity_153vvhu" targetRef="Event_1a1foyk" />
    <intermediateCatchEvent id="Event_1mpvo0c">
      <signalEventDefinition signalRef="theSignal" />
    </intermediateCatchEvent>
    <sequenceFlow id="Flow_0un80br" sourceRef="Activity_18sdoo1" targetRef="Event_02cn8n4" />
    <intermediateThrowEvent id="Event_02cn8n4">
      <signalEventDefinition signalRef="theSignal" />
    </intermediateThrowEvent>
    <sequenceFlow id="Flow_0no5qu7" sourceRef="Event_02cn8n4" targetRef="Gateway_1ss0n3z" />
  </process>

界面操作

在这里插入图片描述

视频地址:

信号抛出捕获事件

演示demo

信号中间捕获事件

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

### Flowable信号捕获事件的回退处理 在 Flowable 工作流引擎中,当遇到需要从某个特定节点回退的情况时,可以采用多种方式实现这一需求。对于带有信号捕获事件的工作流来说,主要思路是在适当位置插入排他网关,并通过设置流程变量来控制流向。 #### 方法一:使用排他网关配合流程变量 为了使工作流能够根据条件返回到之前的节点,在任务完成后立即设定一个名为 `backToPreviousNode` 的布尔型流程变量[^2]: ```java // 设置流程变量以指示是否应回退至先前节点 execution.setVariable("backToPreviousNode", true); ``` 随后,在紧接该任务之后的位置配置一个排他网关 (Exclusive Gateway),它会依据上述变量的状态判断下一步骤应前往何处。如果此变量被设为 `true`,则路径将转向指定的历史节点;反之,则继续沿原定路线前进。 #### 方法二:利用边界定时器或消息事件监听状态变化 另一种方案涉及引入额外的时间管理机制或是外部触发的消息通知作为辅助手段。例如,可以在目标活动上附加一个边界定时器事件,一旦超时期满便激活相应的补偿措施——即发送特殊指令让当前实例跳转回到初始阶段重新开始评估。 然而这种方法相对复杂些,通常只适用于那些对响应速度有较高要求的应用场景下。 #### 实现案例分析 针对具体应用场景中的并行审批环节,假设存在两个平行分支分别由不同级别的管理人员审核文件。此时若需确保任一分支未完成的情况下整个流程均能安全撤回到起点处等待修正后再发起新一轮审查请求的话,那么就需要特别注意以下几点设计考量[^3]: - **统一入口**:保证所有可能成为终止点的任务都具备一致性的退出逻辑; - **全局监控**:借助服务任务(Service Task) 或者 JavaDelegate 接口编写自定义处理器用于实时跟踪各子线程进展状况; - **集中决策**:设立专门负责协调各方意见汇总工作的中心枢纽角色(如图所示),以此为基础制定最终处置方针并向外界传达确切指引信息。 综上所述,无论是简单的单一流向调整还是复杂的多路并发结构重组,Flowable 都提供了灵活而强大的工具集支持开发者按照实际业务需求定制专属解决方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小学生05101

flowable

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

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

打赏作者

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

抵扣说明:

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

余额充值