专栏首页指缝阳光第十一节:Activiti6.0——定时器开始事件、消息开始事件和错误开始事件介绍

第十一节:Activiti6.0——定时器开始事件、消息开始事件和错误开始事件介绍

一、概述

介绍: 在activiti中,事件按位置分可以有:开始事件中间事件边界时间结束事件;按事件的特性区分有:捕获事件抛出事件。除了事件,还有各种事件定义,常用的有:定时器事件定义错误事件定义信号事件定义消息事件定义取消事件定义补偿事件定义等。事件和事件定义可以进行组合,成为特定的事件。

此刻: 本文主要讲四种开始事件

  1. 无指定开始事件:不为开始事件指定任何的触发条件的事件。此处不介绍。
  2. 定时器开始事件:在开始事件中加入定时器事件定义。
  3. 消息开始事件:在开始事件中加入消息事件定义。
  4. 错误开始事件:错误开始事件只能使用在事件的子流程。

二、定时器开始事件

  1. 流程图
  1. 流程xml
	<process id="myProcess_1" isClosed="false" isExecutable="true" processType="None">
    <startEvent id="_2" name="StartEvent">
      <timerEventDefinition>
        <!--从每分钟的0s开始,每隔5秒开始一次流程(生成一个流程实例)-->
        <timeCycle>0/5 * * * * ?</timeCycle>
      </timerEventDefinition>
    </startEvent>
    <userTask activiti:exclusive="true" id="UserTask" name="UserTask"/>
    <endEvent id="_4" name="EndEvent"/>
    <sequenceFlow id="_5" sourceRef="_2" targetRef="UserTask"/>
    <sequenceFlow id="_6" sourceRef="UserTask" targetRef="_4"/>
    </process>
  1. 编码部署
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();

//部署流程后,不用我们自己启动流程实例,定时器的时间到了后会自动启动流程实例
Deployment deployment = repositoryService.createDeployment().addClasspathResource("timer-start-event.bpmn").deploy();

long count = runtimeService.createProcessInstanceQuery().count();
System.out.println("sleep前的流程实例个数:" + count);

//
// 
//睡眠20s,5s运行一次,则会多4个流程实例
Thread.sleep(20 * 1000);

count = runtimeService.createProcessInstanceQuery().count();
System.out.println("sleep后的流程实例个数:" + count);

processEngine.close();
System.exit(0);
  1. 结果查看
  1. 个人遇到问题及猜测:在测试过程中遇到个数和时间不对。 定时开始事件设置的时间间隔为1s,31s后流程实例增加个数为3个,个人猜测:定时开始事件的流程实例启动间隔强制大于等于10s若设置的小于10s,则使用10s;若设置的时间间隔大于10s,则以设置的为准)

三、消息开始事件

  1. 流程图
  1. 流程xml
<message id="msg" name="msgName"></message>
<process id="myProcess_1" isClosed="false" isExecutable="true" processType="None">
  <startEvent id="_2" name="StartEvent">
    <!--开始事件引用消息-->
    <messageEventDefinition messageRef="msg"></messageEventDefinition>
  </startEvent>
  <userTask activiti:exclusive="true" id="UserTask" name="UserTask"/>
  <endEvent id="_4" name="EndEvent"/>
  <sequenceFlow id="_5" sourceRef="_2" targetRef="UserTask"/>
  <sequenceFlow id="_6" sourceRef="UserTask" targetRef="_4"/>
</process>
  1. 编码部署
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();

Deployment deployment = repositoryService.createDeployment().addClasspathResource("message-start-event.bpmn").deploy();


//通过消息启动流程实例,在一个项目中的消息事件会存储在表act_ru_event_subscr中,
// 并且因为流程实例依靠具体的消息来启动,因此在该项目中的消息需要唯一。例:如果一个流程的消息name定义为"msgName",第一次部署时act_ru_event_subscr
// 表会存储消息与部署的流程定义的关联,之后再部署相同的消息时,不会再增加记录,不会与消息绑定;即只有第一绑定消息的流程定义是有效的。
ProcessInstance processInstance = runtimeService.startProcessInstanceByMessage("msgName");
System.out.println("流程实例ID:" + processInstance.getId());

processEngine.close();
System.exit(0);

4.结果查看: 运行结果:流程实例ID:345012 表act_ru_event_subscr:

四、错误开始事件

介绍: 此处模拟流程为,一个班级,班长清点人数,发现人数少了后,马上去报告班主任。

  1. 流程图
  1. 流程xml
<error id="errorId" errorCode="abc"></error>
<process id="myProcess_1" isClosed="false" isExecutable="true" processType="None">
  <startEvent id="_2" name="StartEvent"/>
  <serviceTask activiti:exclusive="true" id="CountPeople" name="CountPeople"
               activiti:class="com.xjf.test.delegate.CountPeopleDelegate"/>
  <endEvent id="_4" name="EndEvent"/>
  <sequenceFlow id="_5" sourceRef="_2" targetRef="CountPeople"/>
  <sequenceFlow id="_6" sourceRef="CountPeople" targetRef="_4"/>
  <!--triggeredByEvent配置必须为true,默认是false-->
  <subProcess activiti:exclusive="true" id="_7" name="SubProcess" triggeredByEvent="true">
    <startEvent id="_8" name="StartEvent">
      <errorEventDefinition errorRef="errorId"></errorEventDefinition>
    </startEvent>
    <serviceTask activiti:exclusive="true" id="Report" name="Report"
                 activiti:class="com.xjf.test.delegate.ReportDelegate"/>
    <endEvent id="_10" name="EndEvent"/>
    <sequenceFlow id="_3" sourceRef="_8" targetRef="Report"/>
    <sequenceFlow id="_11" sourceRef="Report" targetRef="_10"/>
  </subProcess>
</process>
  1. ServiceTask的两个委托类
public class CountPeopleDelegate implements JavaDelegate {
    @Override
    public void execute(DelegateExecution delegateExecution) {
        System.out.println("清点人数,要抛出错误");

        //抛出错误,子流程的错误开始事件会捕获
        throw new BpmnError("abc");
    }
}

public class ReportDelegate implements JavaDelegate {
    @Override
    public void execute(DelegateExecution delegateExecution) {
        System.out.println("少人了,准备上报");
    }
}
  1. 编码发布
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();

Deployment deployment = repositoryService.createDeployment().addClasspathResource("error-start-event.bpmn").deploy();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();

//流程实例启动后,会自动执行:主流程抛出错误,子流程捕获到错误然后一直执行完
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
System.out.println("流程实例id:" + processInstance.getId());

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

五、总结

  1. 所有的开始事件都是捕获事件,都需要具体的动作或事件来触发。
  2. 错误开始事件不能独立存在,必须是其他事件的子流程。
  3. 边界事件:在BPMN2.0的事件分类中,边界事件被划分到中间事件中,BPMN2.0中将狭义的中间事件和边界事件,统称为中间事件。可以单独作为流程元素存在于流程中的事件为中间事件,而附属于某个流程元素(如任务、子流程等)的事件为边界事件。

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Activiti6.0(二)源码分析helloword

    启动cativiti-app cd modules/activiti-ui/activiti-app mvn clean tomcat7:run 打开浏览...

    楠楠
  • Java入门(基础篇一)

    Java语言是Sun公司在1995年推出的高级编程语言,编程语言就是计算机语言,人们可以通过使用编程语言让计算机完成很多功能。

    故里
  • NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例

      “消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。消息被发送到队列中,“消息队列”是在消息的传...

    Edison Zhou
  • 使用SAT跟踪监控从浏览器打开的SAP应用的性能和调用栈

    今天是农历鼠年大年初四,本文是鼠年第4篇文章,也是汪子熙公众号第203篇原创文章。

    Jerry Wang
  • 使用SAT跟踪监控从浏览器打开的SAP应用的性能和调用栈

    今天是农历鼠年大年初四,本文是鼠年第4篇文章,也是汪子熙公众号第203篇原创文章。

    Jerry Wang
  • libevent源码深度剖析八 集成信号处理

    (1)libevent源码深度剖析一 序 (2)libevent源码深度剖析二 Reactor模式 (3)libevent源码深度剖析三 libevent基...

    范蠡
  • libevent源码深度剖析十二 让libevent支持多线程

    (1)libevent源码深度剖析一 序 (2)libevent源码深度剖析二 Reactor模式 (3)libevent源码深度剖析三 libevent基本使...

    范蠡
  • 入门 Node.js Net 模块构建 TCP 网络服务

    想做一个简单的 Web API,这个时候就需要搭建一个 Web 服务器,在 ASP.NET 中需要 IIS 来搭建服务器,PHP 中需要借助 Apache/Ng...

    五月君
  • MySQL Group Replication的安装部署

    这次给大家介绍下MySQL官方最新版本5.7.17中GA的新功能 Group Replication 。

    py3study
  • 分布式事务处理技术之LCN

    分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。

    时间静止不是简史
  • WebView开源库终极方案

    杨充
  • 微信小程序的生命周期学习笔记-应用篇

    在我们学习微信小程序的过程当中,我们会参考很多资料。在这些资料中,我们经常能够看到“生命周期”四个字,在前面的课程中也提到过。在这里做一个说明。

    面向对象思考
  • 温度采集系统上位机设计

    上一次我们讲到了多点温度采集系统的设计,为此,特意开发了一个上位机用于显示温度,这一节就是来说一下上位机的开发。

    飞哥
  • STM32H7的CAN FD学习笔记整理贴(2021-03-15)

    CAN FD(CAN with flexible data-rate)是CAN2.0协议的扩展,CAN-FD由博世开发,并由 ISO 11898-1:2015标...

    armfly
  • Java学习笔记-全栈-web开发-03-JavaScript基础

    在javascript中使用 var 运算符(variable 的缩写)加变量名定义的。

    devi
  • 常用的分布式事务解决方案

    众所周知,数据库能实现本地事务,也就是在同一个数据库中,你可以允许一组操作要么全都正确执行,要么全都不执行。这里特别强调了本地事务,也就是目前的数据库只能支持...

    大闲人柴毛毛
  • 常用的分布式事务解决方案

    事务由一组操作构成,我们希望这组操作能够全部正确执行,如果这一组操作中的任意一个步骤发生错误,那么就需要回滚之前已经完成的操作。也就是同一个事务中的所有操作,要...

    CG国斌
  • 深入浅出 Performance 工具 & API

    日常开发任务中,对于性能优化或多或少会接触到一些内容,可能也参照过 雅虎35条军规[1]进行过相关的性能优化,但是具体的优化结果以及实际的页面速度如何,我们怎么...

    wade
  • 可靠的远程代码执行(1)

    导致反恐精英全球攻势(以下简称“CS:GO”)大受欢迎的因素之一是任何人都可以托管自己的社区服务器。这些社区服务器可以免费下载和安装,并允许进行高级别的定制。服...

    franket

扫码关注云+社区

领取腾讯云代金券