定义
信号中间事件分为 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>
界面操作
视频地址:
FlowableBpmn2.0组件讲解