信号边界事件
定义
信号边界事件会捕获信号定义引用的相同信号名的信号。当执行到达边界信号事件依附的任务
时(如用户任务、子流程等),引擎会创建一个捕获事件,在其依附的任务的生命周期内等待一个
抛出信号,该信号可以来自流程的信号抛出事件,或者由 API 触发,被触发后流程会沿信号边界
事件的后继路线继续执行。
图形标记
信号边界事件显示为普通的中间事件(圆圈里有个小圆圈),位置在节点的边缘,内部有一个
信号小图标。信号图标是白色的(未填充),来表示捕获的意思,如下图所示
XML内容
<signal id="theSignal" name="The Signal" />
<process id="signalBoundaryInterrputingEventProcess">
<userTask id="usertask1" name="测试信号任务"></userTask>
<boundaryEvent id="signalBoundaryInterrputingEvent" name="Timer"
attachedToRef="usertask1" cancelActivity="false">
<signalEventDefinition signalRef="theSignal"/>
</boundaryEvent>
</process>
在以上 xml 代码片段中,加粗的部分分别定义了 signal、userTask 和 boundaryEvent,信号 signal
的 id 属性值为 theSignal,信号边界事件 boundaryEvent 中的 signalEventDefinition 子元素通过设置
signalRef 为 theSignal 引用了该信号,同时使用 attachedToRef 属性将其绑定到 userTask 上。
cancelActivity 属性用法与定时边界事件相同。
这里是将信号边界事件附加在了用户任务节点上,其它流程活动(如子流程等)也可以附加。
信号边界事件接收到指定的信号后就会触发。需要注意的是,信号事件是全局的,即在一个流
程实例中抛出一个信号事件,其他不同流程定义的流程实例都可以监听到这个事件(一处发信号,
所有信号的边界事件都能接收)。如果想要限制信号事件的范围,只希望在同一个流程实例中响应
这个信号事件,可以使用信号事件定义的 scope 属性(不是 BPMN2.0 的标准属性):
<signal id="alertSignal" name="alert" flowable:scope="processInstance"/>
其中,flowable:scope 的默认值是 global,代表全局;设置为 processInstance 时,作用范围仅仅
是在发生事件的流程实例里。
使用示例
信号边界事件的触发条件是接收信号,它具有全局性,可以捕获流程引擎内全局范围的信号。
信号边界事件触发的方式有两种:
(1)流程中抛出信号事件(Signal Intermediate Throwing Event)、信号结束事件(Signal End
Event)发出的信号。
(2)通过 API 触发,在 Flowable 中通过调用 runtimeService.signalEventReceived 系列方法发出一
个指定的信号。runtimeService.signalEventReceived 系列方法如下图所示:
API 方法 | 含义 |
---|---|
runtimeService.signalEventReceived(String signalName) | 把信号发送给全局所有订阅的处理器 |
runtimeService.signalEventReceived(String signalName, String executionId) | 把信号发送给指定执行流 |
界面操作
总结
信号边界事件分全局的和局部的 属性设置为flowable:scope="global"为全局的,默认不写也是全局的;flowable:scope="processInstance"为当前流程实例有效,这个不是bpmn2.0规范,是flowable的规范,但是非常有用
视频地址:
演示demo
本文中内容和案例出自贺波老师的书《深入Activiti流程引擎:核心原理与高阶实战》,书中的介绍更全面、详细,推荐给大家。
深入Activiti流程引擎