一、抛出信号与信号启动
启动信号事件:
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>Flow_0gwjwzm</bpmn:outgoing>
<bpmn:signalEventDefinition id="SignalEventDefinition_1tijenm" signalRef="Signal_16v6gdz" />
</bpmn:startEvent>
<bpmn:signal id="Signal_16v6gdz" name="signal1" />
EXECUTION_ID_
以PROC_INST_ID_
列没有值,为什么没有值呢?因为它是与流程定义绑定的(全局的),不是和流程实例绑定的。
发射信号,使流程启动:
@Test
public void signalEventReceived() {
runtimeService.signalEventReceived("signal1");
}
启动后,信号依然存在,不然就无法再次启动了。
抛出信号事件:
<bpmn:intermediateThrowEvent id="Event_0z6347z">
<bpmn:incoming>Flow_051826m</bpmn:incoming>
<bpmn:outgoing>Flow_176b1gd</bpmn:outgoing>
<bpmn:signalEventDefinition id="SignalEventDefinition_04vxqgl" signalRef="Signal_16v6gdz" />
</bpmn:intermediateThrowEvent>
<bpmn:signal id="Signal_16v6gdz" name="signal1" />
注:之前信号启动事件订阅表有值,这时候用同一个流程KEY,部署该流程(没有信号启动事件),那么就之前的事件订阅表就会被清理,因为按最新版本来。如果要保留之前的,那么就得换一个流程KEY来部署该流程。
这里将两个流程(该流程与启动信号事件流程)用不同的key,同时部署
@Test
public void createDeployment() {
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
Deployment deployment = deploymentBuilder
// .name("启动信号事件")
.name("抛出信号与启动事件")
.source("本地测试")
.tenantId("a")
.addClasspathResource("com.demo/ch15/signal.bpmn")
.addClasspathResource("com.demo/ch15/signal_throw.bpmn")
.deploy();
System.out.println(deploymentBuilder);
System.out.println(deployment);
}
@Test
public void startProcessInstanceByKey() {
runtimeService.startProcessInstanceByKey("signalThrow");
}
二、抛出信号与捕获信号结合使用
信号范围:
测试:一个抛出信号,一个捕获信号(实例信号),一个信号启动事件(全局信号)
<bpmn:intermediateThrowEvent id="Event_0z6347z">
<bpmn:incoming>Flow_051826m</bpmn:incoming>
<bpmn:outgoing>Flow_176b1gd</bpmn:outgoing>
<bpmn:signalEventDefinition id="SignalEventDefinition_04vxqgl" signalRef="Signal_16v6gdz" />
</bpmn:intermediateThrowEvent>
<bpmn:signal id="Signal_16v6gdz" name="alert" />
<bpmn:intermediateCatchEvent id="Event_0z6347z">
<bpmn:incoming>Flow_051826m</bpmn:incoming>
<bpmn:outgoing>Flow_176b1gd</bpmn:outgoing>
<bpmn:signalEventDefinition id="SignalEventDefinition_0rf98t9" signalRef="Signal_1w5839j" />
</bpmn:intermediateCatchEvent>
<bpmn:signal id="Signal_1w5839j" name="alert" />
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>Flow_0gwjwzm</bpmn:outgoing>
<bpmn:signalEventDefinition id="SignalEventDefinition_1tijenm" signalRef="Signal_16v6gdz" />
</bpmn:startEvent>
<bpmn:signal id="Signal_16v6gdz" name="alert" />
@Test
public void createDeployment() {
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
Deployment deployment = deploymentBuilder
.name("抛出信号与捕获信号")
.source("本地测试")
.tenantId("a")
.addClasspathResource("com.demo/ch15/signal.bpmn")
.addClasspathResource("com.demo/ch15/signal_catch.bpmn")
.addClasspathResource("com.demo/ch15/signal_throw2.bpmn")
.deploy();
System.out.println(deploymentBuilder);
System.out.println(deployment);
}
部署后就会产生一条全局信号
首先启动捕获信号实例
@Test
public void startProcessInstanceByKey() {
runtimeService.startProcessInstanceByKey("signalCatch");
}
然后启动抛出信号实例
@Test
public void startProcessInstanceByKeyThrow() {
runtimeService.startProcessInstanceByKey("signalThrow2");
}
启动捕获信号实例后,会产生一条跟实例挂钩的数据
三、抛出信号与终止边界信号、启动事件信号配合使用
<bpmn:boundaryEvent id="Event_1jgbusw" attachedToRef="Activity_061gqdm">
<bpmn:outgoing>Flow_0w7snd5</bpmn:outgoing>
<bpmn:signalEventDefinition id="SignalEventDefinition_03p6if8" signalRef="Signal_1w5839j" />
</bpmn:boundaryEvent>
<bpmn:signal id="Signal_1w5839j" name="alert" />
抛出信号流程与上述例子一致
1、启动第一个流程,走到”任务1“,产生了一个跟实例绑定的事件订阅的局部信号
2、启动抛出信号流程,会发射信号发射信号之后,该流程走到”任务抛出节点“,局部订阅的信号被激活并删除,第一个实例原有的任务数据被删除,第一个实例直接走到”任务2“
四、抛出信号与非终止边界信号
<bpmn:boundaryEvent id="Event_1jgbusw" cancelActivity="false" attachedToRef="Activity_061gqdm">
<bpmn:outgoing>Flow_0w7snd5</bpmn:outgoing>
<bpmn:signalEventDefinition id="SignalEventDefinition_1uyjxge" signalRef="Signal_1w5839j" />
</bpmn:boundaryEvent>
<bpmn:signal id="Signal_1w5839j" name="alert" />
抛出信号与上述一致
示例一:
1、启动第一个流程,订阅表查询局部信号,走到”任务1“
2、启动第二个流程,发射信号,发射后,局部订阅信号不会被删除,第一个实例原有任务数据没有被删除,第一个实例多了一个执行实例直接走向”任务2“
3、完成”任务2“,当前执行实例的父级实例不会立马完成,对应的局部订阅信号仍存在
4、完成”任务1“,当前执行实例的实例立马完成,对应的局部订阅信号被删除
示例二:
1、同示例一
2、同示例一
3、完成”任务1“,当前执行实例父级实例不会立马完成,但是对应的局部信号被删除
五、信号小结
手工广播消息:
信号结束事件:
启动第一个流程并完成”任务1“,第二个实例开始运转到”任务1“
代码参考:https://github.com/zhoupengwa/ProcessEngineDemo
学习来源:腾讯课堂