专栏首页指缝阳光第九节:Activiti6.0——ReceiveTask接收信号、中间信号捕获事件和中间消息捕获事件的流程推进

第九节:Activiti6.0——ReceiveTask接收信号、中间信号捕获事件和中间消息捕获事件的流程推进

一、概述

介绍: 在我们获取流程实例后,需要对流程进行推进,就是使执行流往前执行。本篇即介绍在不同情况下,流程自动推进的方法。主要是三种:

  • ①ReceiveTask接收信号后往前执行
  • ②中间信号捕获事件接收信号后往前执行
  • ③中间消息捕获事件接收消息后往前执行

二、ReceiveTask接收信号

  1. bpmn文件如下:
  1. 编码如下:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();

Deployment deployment = repositoryService.createDeployment().addClasspathResource("receiveTask.bpmn").deploy();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());

//获取流程实例id,即为主执行流的id
System.out.println("流程实例id:" + processInstance.getId());

//获取执行流
Execution execution = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).onlyChildExecutions().singleResult();

//使用ACT_ID_来标识执行流,对应bpmn文件中receiveTask标签的id
System.out.println("当前执行流:" + execution.getActivityId());

Thread.sleep(10000);

//调用方法使流程继续,需要执行流的id来进行触发(此处bpmn使用的是ReceiveTask来接收触发,经测试UserTask不能)
runtimeService.trigger(execution.getId());

//再次查询当前执行流
execution = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).onlyChildExecutions().singleResult();

//使用ACT_ID_来标识执行流
System.out.println("当前执行流:" + execution.getActivityId());

//关闭
processEngine.close();
System.exit(0);
  1. 打印结果,具体数据库可以自行查看。

三、中间信号捕获事件

  1. bpmn如下:
  1. xml需要添加信号定义,才能在发送该信号后,事件能捕获到。
<!--信号定义-->
<signal id="testSignal" name="testSignal2"></signal>
<process id="myProcess_1" isClosed="false" isExecutable="true" processType="None">
  <startEvent id="_2" name="StartEvent"/>
  <intermediateCatchEvent id="IntermediateCatchingEvent" name="IntermediateCatchingEvent" >
    <!--信号定义引用-->
    <signalEventDefinition signalRef="testSignal" ></signalEventDefinition>
  </intermediateCatchEvent>
  <userTask activiti:exclusive="true" id="UserTask" name="UserTask"/>
  <endEvent id="_5" name="EndEvent"/>
  <sequenceFlow id="_6" sourceRef="_2" targetRef="IntermediateCatchingEvent"/>
  <sequenceFlow id="_7" sourceRef="IntermediateCatchingEvent" targetRef="UserTask"/>
  <sequenceFlow id="_8" sourceRef="UserTask" targetRef="_5"/>
</process>
  1. 编码如下:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();

Deployment deployment = repositoryService.createDeployment().addClasspathResource("SingleEvent.bpmn").deploy();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
System.out.println("主执行流id: " + processInstance.getId());

//获取当前执行流,此处知道子执行流是一个,所以使用的是singleResult,如果是多个则需要用list
Execution execution = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).onlyChildExecutions().singleResult();
System.out.println("当前执行流:" + execution.getActivityId());

//发送信号使执行流继续执行(可以不指定执行流id),经测试:此处的信号名称与bpmn文件中信号定义的name值相同才行
runtimeService.signalEventReceived("testSignal2");
//        runtimeService.signalEventReceived("testSignal2",execution.getId());

//获取当前子执行流
execution = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).onlyChildExecutions().singleResult();
System.out.println("当前执行流:" + execution.getActivityId());

processEngine.close();
System.exit(0);
  1. 结果如下:

四、中间消息捕获事件

  1. bpmn文件
  1. xml需要添加消息定义,这样才能在发送消息后能进行捕获、
<!--消息定义-->
<message id="messageId" name="messageName"></message>
<process id="myProcess_1" isClosed="false" isExecutable="true" processType="None">
  <startEvent id="_2" name="StartEvent"/>
  <intermediateCatchEvent id="IntermediateCatchingEvent" name="IntermediateCatchingEvent">
    <!--消息定义引用-->
    <messageEventDefinition messageRef="messageId"></messageEventDefinition>
  </intermediateCatchEvent>
  <userTask activiti:exclusive="true" id="UserTask" name="UserTask"/>
  <endEvent id="_5" name="EndEvent"/>
  <sequenceFlow id="_6" sourceRef="_2" targetRef="IntermediateCatchingEvent"/>
  <sequenceFlow id="_7" sourceRef="IntermediateCatchingEvent" targetRef="UserTask"/>
  <sequenceFlow id="_8" sourceRef="UserTask" targetRef="_5"/>
</process>
  1. 编码如下:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
TaskService taskService = processEngine.getTaskService();

Deployment deployment = repositoryService.createDeployment().addClasspathResource("MessageEvent.bpmn").deploy();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());

System.out.println("主执行流id: " + processInstance.getId());

//使用任务的方法去获取执行流,居然获取不到,报空指针
//        Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
//        Execution execution = runtimeService.createExecutionQuery().executionId(task.getExecutionId()).singleResult();

//获取当前执行流,此处知道子执行流是一个,所以使用的是singleResult,如果是多个则需要用list
Execution execution = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).onlyChildExecutions().singleResult();
System.out.println("当前执行流id:" + execution.getId() + "               执行流名称:" + execution.getActivityId());

//发送消息,使执行流继续执行,发送的消息名称也是对应bpmn文件消息定义中的name标签值,
//消息中间事件和信号中间事件的区别:信号可以不指定执行流id,消息必须执行执行流id。就相当于信号可以是广播处理,消息是一对一的。
runtimeService.messageEventReceived("messageName",execution.getId());

//获取当前执行流
execution = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).onlyChildExecutions().singleResult();
System.out.println("当前执行流id:" + execution.getId() + "               执行流名称:" + execution.getActivityId());

processEngine.close();
System.exit(0);
  1. 结果

五、总结

  1. bpmn文件中 中间信号捕获事件中间消息捕获 事件使用的都是同一个控件,区别是一个使用的是信号定义,一个是消息定义。
  2. 在执行流的数据库表act_ru_execution中,执行流往前执行后使用的是同一个执行流id,版本变了(跟上面的中间消息捕获事件联系),具体情况还要继续学习后才知道。
  1. 中间信号捕获事件中发送信号使执行流继续执行(可以不指定执行流id),而中间消息捕获事件中发送消息必指定执行流id,由此得出:信号可以是广播处理,消息是一对一的

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JavaScript事件

    JavaScript事件 对于事件来讲,首先,我们需要了解这样几个概念:事件;事件处理程序;事件类型;事件流;事件冒泡;事件捕获;事件对象;事件模拟,事件方面的...

    汤高
  • Flowable学习笔记(二、BPMN 2.0-基础 )

    业务流程模型和标记法(BPMN, Business Process Model and Notation)是一套图形化表示法,用于以业务流程模型详细说明各种业务...

    三分恶
  • 一篇讲透自研的前端错误监控

    在我司线上运行的是近亿级别的广告页面,这样线上如果裸奔,出现了什么问题不知道,后置在业务端发现,被业务方询问,这种场景很尴尬。

    ConardLi
  • 【安富莱二代示波器教程】第1章 示波器基础知识

    本章的内容整理自网络,主要讲解示波器的基础知识。如果初学的话非常有必要对这部分知识有一个了解。因为示波器是硬件调试必不可少的设备。

    armfly
  • 流处理与消息队列------《Designing Data-Intensive Applications》读书笔记16

    在流处理之中,当输入是文件时,第一个处理步骤通常是将其解析为一连串的记录。在流处理之中,记录通常被称为事件,每个事件都是一个小的、独立的、不可变的对象,通常每个...

    HappenLee
  • 事件高级

    eventTarget . addEventListener (type, listener[, useCapture] )

    清出于兰
  • 沉淀了3年的自研前端错误监控系统,打通你的脉络

    这篇文章是我的好朋友广胤所写,里面记录了我们2018年探索的前端监控体系的历程,由于在建设完后的我离职了,后续也没有继续能和广胤一起更进一步的探索,还是有一些些...

    童欧巴
  • 沉淀了3年的自研前端错误监控系统,打通你的脉络

    这篇文章是我的好朋友广胤所写,里面记录了我们2018年探索的前端监控体系的历程,由于在建设完后的我离职了,后续也没有继续能和广胤一起更进一步的探索,还是有一些些...

    秋风的笔记
  • 一个Python开源项目-哈勃沙箱源码剖析(下)

    在上一篇中,我们讲解了哈勃沙箱的技术点,详细分析了静态检测和动态检测的流程。本篇接着对动态检测的关键技术点进行分析,包括strace,sysdig,volati...

    七夜安全博客
  • 实例3、研究 ICMP 数据包

    学习目标 了解 ICMP 数据包的格式 使用 Packet Tracer 捕获并研究 ICMP 报文 简介: Wireshark 可以捕获和显示通过网络接口...

    py3study
  • 【刘文彬】 Controller:EOS区块链核心控制器

    原文链接:醒者呆的博客园,https://www.cnblogs.com/Evsward/p/controller.html

    圆方圆学院
  • 近期黑客攻击我国视频监控设备的情况分析

    近日,绿盟威胁情报中心监测到,境外黑客组织发布推文宣布将于2月13日对我国实施网络攻击。

    绿盟科技研究通讯
  • 2021全网最全Activiti7教程04(Activiti7进阶篇-欢迎收藏)

      本篇重点给大家介绍下Activiti中的高级内容,比如流程实例,个人任务,流程变量,组任务及网关。

    用户4919348
  • 逆向分析智能窗帘频射协议

    近来我热衷于对家庭自动化设备的破解,然后将它们添加到我的Homekit集成包之中。这事情要从几个月前说起,当时我爸订购了大批量的RAEX 433MHz射频电动窗...

    FB客服
  • iOS Crash防护你看这个就够了-下篇

    0x1: Previously 上篇 中讲到了Crash处理流程分为四个环节,也分析了Crash防护的方法,本章来讲下其余三个环节:Crash的拦截、Cras...

    QQ音乐技术团队
  • Bugless 异常监控系统 (iOS端)

    移动App 发布后,如果想获取 App 的业务运行状态,通常是通过服务端接口反映到状态或者是用户反馈,缺少客户端的异常错误的线上监控、告警与异常数据聚合并沉淀的...

    37手游iOS技术运营团队
  • Oracle 自动故障诊断

    Oracle故障诊断有助于预防,检测,诊断和解决问题。特别针对的问题是诸如由代码错误,元数据损坏和客户数据损坏引起的重大错误。

    Leshami
  • 使用 ETW 对 .NET 应用程序进行性能诊断

    下载代码示例 您编写一个托管应用程序来亲身体验一下 – 您会觉得其速度较慢。您的应用程序在功能上是正常的,但其性能有很多不足。您想诊断出性能问题并解决这些问题,...

    张善友
  • 让前端监控数据采集更高效

    随着业务的快速发展,我们对生产环境下的问题感知能力越来越关注。作为距离用户最近的一层,前端的表现是否可靠、稳定、好用,很大程度上决定着用户对整个产品的体验和感受...

    桃翁

扫码关注云+社区

领取腾讯云代金券