ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-03-09 17:01:58  阅读:416  来源: 互联网

标签:十一 框架 启动 抛出 流程 Flow 实例 信号 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" />

在这里插入图片描述
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

学习来源:腾讯课堂

标签:十一,框架,启动,抛出,流程,Flow,实例,信号,camunda
来源: https://blog.csdn.net/qq_35890572/article/details/114588405

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有