前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第九节:Activiti6.0——ReceiveTask接收信号、中间信号捕获事件和中间消息捕获事件的流程推进

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

作者头像
凡人飞
发布2020-09-21 10:37:44
2.2K0
发布2020-09-21 10:37:44
举报
文章被收录于专栏:指缝阳光

一、概述

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

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

二、ReceiveTask接收信号

  1. bpmn文件如下:
  1. 编码如下:
代码语言:javascript
复制
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需要添加信号定义,才能在发送该信号后,事件能捕获到。
代码语言:javascript
复制
<!--信号定义-->
<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. 编码如下:
代码语言:javascript
复制
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需要添加消息定义,这样才能在发送消息后能进行捕获、
代码语言:javascript
复制
<!--消息定义-->
<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. 编码如下:
代码语言:javascript
复制
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,由此得出:信号可以是广播处理,消息是一对一的
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/11/28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、概述
  • 二、ReceiveTask接收信号
  • 三、中间信号捕获事件
  • 四、中间消息捕获事件
  • 五、总结
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档