camunda框架学习(十一)信号系列

一、抛出信号与信号启动

启动信号事件:

camunda框架学习(十一)信号系列

    <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" />

camunda框架学习(十一)信号系列
EXECUTION_ID_PROC_INST_ID_列没有值,为什么没有值呢?因为它是与流程定义绑定的(全局的),不是和流程实例绑定的。

发射信号,使流程启动:

    @Test
    public void signalEventReceived() {
        runtimeService.signalEventReceived("signal1");
    }

camunda框架学习(十一)信号系列
启动后,信号依然存在,不然就无法再次启动了。

抛出信号事件:

camunda框架学习(十一)信号系列

    <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");
    }

camunda框架学习(十一)信号系列
camunda框架学习(十一)信号系列

二、抛出信号与捕获信号结合使用

信号范围:

camunda框架学习(十一)信号系列
测试:一个抛出信号,一个捕获信号(实例信号),一个信号启动事件(全局信号)
camunda框架学习(十一)信号系列

<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" />

camunda框架学习(十一)信号系列

    <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" />

camunda框架学习(十一)信号系列

    <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);
    }


部署后就会产生一条全局信号
camunda框架学习(十一)信号系列
首先启动捕获信号实例

    @Test
    public void startProcessInstanceByKey() {
        runtimeService.startProcessInstanceByKey("signalCatch");
    }

然后启动抛出信号实例

    @Test
    public void startProcessInstanceByKeyThrow() {
        runtimeService.startProcessInstanceByKey("signalThrow2");
    }

启动捕获信号实例后,会产生一条跟实例挂钩的数据
camunda框架学习(十一)信号系列
camunda框架学习(十一)信号系列
camunda框架学习(十一)信号系列

三、抛出信号与终止边界信号、启动事件信号配合使用

camunda框架学习(十一)信号系列

    <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" />

camunda框架学习(十一)信号系列
抛出信号流程与上述例子一致

1、启动第一个流程,走到”任务1“,产生了一个跟实例绑定的事件订阅的局部信号
camunda框架学习(十一)信号系列
2、启动抛出信号流程,会发射信号发射信号之后,该流程走到”任务抛出节点“,局部订阅的信号被激活并删除,第一个实例原有的任务数据被删除,第一个实例直接走到”任务2“

四、抛出信号与非终止边界信号

camunda框架学习(十一)信号系列

    <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" />

camunda框架学习(十一)信号系列
抛出信号与上述一致

示例一:

1、启动第一个流程,订阅表查询局部信号,走到”任务1“
camunda框架学习(十一)信号系列

2、启动第二个流程,发射信号,发射后,局部订阅信号不会被删除,第一个实例原有任务数据没有被删除,第一个实例多了一个执行实例直接走向”任务2“
camunda框架学习(十一)信号系列
3、完成”任务2“,当前执行实例的父级实例不会立马完成,对应的局部订阅信号仍存在
camunda框架学习(十一)信号系列
4、完成”任务1“,当前执行实例的实例立马完成,对应的局部订阅信号被删除
camunda框架学习(十一)信号系列

示例二:

1、同示例一

2、同示例一

3、完成”任务1“,当前执行实例父级实例不会立马完成,但是对应的局部信号被删除
camunda框架学习(十一)信号系列

五、信号小结

camunda框架学习(十一)信号系列

手工广播消息:

camunda框架学习(十一)信号系列

信号结束事件:

camunda框架学习(十一)信号系列
camunda框架学习(十一)信号系列
启动第一个流程并完成”任务1“,第二个实例开始运转到”任务1“

camunda框架学习(十一)信号系列
代码参考:https://github.com/zhoupengwa/ProcessEngineDemo

学习来源:腾讯课堂

上一篇:[ZJOI2007]矩阵游戏


下一篇:zoj 1842 Prime Distance