环境
  JDK 1.8
  MySQL 5.6
  Tomcat 7
  Eclipse-Luna
  activiti 6.0

一、事件定义
1、定时器事件
(1)timeDate:指定时间触发
<timerEventDefinition>
<timeDate>2019-09-12T07:30:00</timeDate>
</timerEventDefinition>
ISO8601时间格式,如果要加时间需要前面加T。

(2)timeDuration:指定一个时间段之后执行
<timerEventDefinition>
<timeDuration>PT1S</timeDuration>
</timerEventDefinition>
S表示秒,M表示分,D表示天;P表示时间段,T表示精确到时间的时间段;

(3)timeCycle:指定定时器的运行周期
<timerEventDefinition>
<timeCycle>R2/PT1M</timeCycle>
</timerEventDefinition>
R表示需要执行的次数,R2/PT1M表示执行两次,每次持续1分钟
支持cron表达式:秒 分钟 小时 月份中的日期 月份 星期中的日期 年份

2、错误事件
处理流程中出现的异常。
举例:
<error id="myerror" errorCode="123"></error>
<process id="testp" name="testp">
<endEvent id="myerrorevent">
<errorEventDefinition errorRef="myerror"></errorEventDefinition>
</endEvent>
</process>

3、信号事件
使用信号给流程发送广播。
<signal id="signalA" name="signalA"></signal>
<process id="testp" name="testp">
...
<signalEventDefinition signalRef="signalA"></signalEventDefinition>
...
</process>

4、消息事件
消息指向某个接收人,而不是整个流程。
<message id="mymessage" name="mymessage"></message>
<process id="testp" name="testp">
...
<messageEventDefinition messageRef="mymessage"></messageEventDefinition>
...
</process>

5、取消事件
取消事件使用在事务子流程中。
<cancelEventDefinition></cancelEventDefinition>

6、补偿事件
补偿事件对于已经完成的流程做回退处理。
<componsateEventDefinition></componsateEventDefinition>

7、其他事件
条件事件:<ConditionalEventDefinition>
升级事件:<EscalationEventDefinition>
连接事件:<LinkEventDefinition>
终止事件:<TerminateEventDefinition>

参考:BPMN事件分类与事件定义

二、开始事件
1、无指定开始事件
不为开始事件指定任何触发条件。
<startEvent id="s" name="s"></startEvent>

2、定时器开始事件
<startEvent id="s" name="s">
<timerEventDefinition id="ss" name="ss">
<timeCycle>PT1S</timeCycle>
</timerEventDefinition>
</startEvent>

3、消息开始事件
<message id="mymessage" name="mymessage"></message>
<process id="testp" name="testp">
<startEvent id="s" name="s">
<messageEventDefinition messageRef="mymessage"></messageEventDefinition>
</startEvent>


4、错误开始事件
错误开始事件只能用在事件子流程中。
<error id="errorId" errorCode="MyErrorCode"></error>
<process id="errorStartEventTest01" name="错误开始事件测试01" isExecutable="true">
<startEvent id="start"></startEvent>
<serviceTask id="serviceTask01" name="Service Task" activiti:class="com.bug315.event.ErrorStartEventDelegate"></serviceTask>
<endEvent id="end"></endEvent>

<sequenceFlow id="sid-1EAADC30-396A-4E19-B181-C688B909510B" sourceRef="serviceTask01" targetRef="end"></sequenceFlow>
<sequenceFlow id="sid-07875D4F-D2C7-47E0-B4C3-6866F110206F" sourceRef="start" targetRef="serviceTask01"></sequenceFlow>

<subProcess id="sid-DDBC6BA0-A097-4FC9-8023-C40E6AD0B499" name="subProcess" triggeredByEvent="true">
<startEvent id="subStart">
<errorEventDefinition errorRef="errorId"></errorEventDefinition>
</startEvent>
<serviceTask id="subServiceTask01" name="Sub Task" activiti:class="com.bug315.event.ErrorHandlerDelegate"></serviceTask>
<endEvent id="subEnd"></endEvent>
<sequenceFlow id="sid-24413ADF-BD05-4BB7-9FA8-E70154B94767" sourceRef="subServiceTask01" targetRef="subEnd"></sequenceFlow>
<sequenceFlow id="sid-A130E45F-9A0B-4362-908E-C8FEB3F640E7" sourceRef="subStart" targetRef="subServiceTask01"></sequenceFlow>
</subProcess>
</process>

参考:开始事件

三、结束事件
1、无指定结束事件
<endEvent id="subEnd" name=""></endEvent>

2、错误结束事件
错误结束事件一般用在子流程中,一般和错误边界事件一起使用才有意义。
<endEvent id="subEnd">
<errorEventDefinition errorRef="errorId"></errorEventDefinition>
</endEvent>

3、取消结束事件和取消边界事件
取消结束事件只能用在事务子流程中,该事件表示事务将会取消,并且会触发附在事务子流程上的取消边界事件。

参考:结束事件
四、边界事件
附属于某个流程元素(如任务、子流程等)的事件为边界事件。边界事件是Catching事件,会等待被触发,当边界事件被触发,当前的活动会被中断,并且当前的顺序流会发生转移。
1、定时器边界事件
需要注意的是:需要开启JobExecutor,cancelActivity属性为true表示原先的流程被中断,false表示不中断,继续执行
示例:
<process id="myProcess" name="My process" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="初级工程师处理"></userTask>
<userTask id="usertask2" name="中级工程师处理"></userTask>
<endEvent id="endevent1" name="End"></endEvent>
<boundaryEvent id="boundarytimer1" name="Timer"
attachedToRef="usertask1" cancelActivity="true">
<timerEventDefinition>
<timeDuration>PT5S</timeDuration>
</timerEventDefinition>
</boundaryEvent>
....
</process>

2、错误边界事件
错误边界事件依附在某个流程活动中,用于捕获子流程中抛出的错误,因此错误边界事件使用在嵌入子流程或调用子流程中。
<process id="ebProcess" name="ebProcess">
<startEvent id="startevent1" name="Start"></startEvent>
<endEvent id="endevent1" name="End"></endEvent>
<subProcess id="subprocess1" name="Sub Process">
<startEvent id="startevent2" name="Start"></startEvent>
<serviceTask id="servicetask1" name="Throw Error Task"
activiti:class="org.crazyit.activiti.ThrowErrorDelegate"></serviceTask>
<endEvent id="endevent2" name="ErrorEnd"></endEvent>
<sequenceFlow id="flow4" name="" sourceRef="startevent2"
targetRef="servicetask1"></sequenceFlow>
<sequenceFlow id="flow5" name="" sourceRef="servicetask1"
targetRef="endevent2"></sequenceFlow>
</subProcess>
<boundaryEvent id="boundaryerror1" cancelActivity="false"
attachedToRef="subprocess1">
<errorEventDefinition errorRef="abc"></errorEventDefinition>
</boundaryEvent>
....
</process>

3、信号边界事件
信号边界事件的触发条件是接收到信号,但是不一样的是,信号边界事件具有全局性,换言之,信号边界事件会进行全局范围的信号捕获。与定时器边界事件类似,信号边界事件同样存在可中断与不可中断两类,可以为boundaryEvent元素设置cancelActivity属性,如果设置为true,那么原来的执行流将会被中断,设置为false,则原来的执行流仍然存在。如果多个信号边界事件使用了相同的信号,当在某个地方发出信号时,即使在不同的流程实例中,这些信号边界事件均会捕获到该信号。
<signal id="contactChangeSignal" name="contactChangeSignal"></signal>
<process id="sbProcess" name="sbProcess">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="签订查看"></userTask>
<userTask id="usertask2" name="合同确认"></userTask>
<boundaryEvent id="boundarysignal1" cancelActivity="true"
attachedToRef="usertask2">
<signalEventDefinition signalRef="contactChangeSignal"></signalEventDefinition>
</boundaryEvent>
<userTask id="usertask3" name="合同变更"></userTask>
<userTask id="usertask4" name="签订合同"></userTask>
<endEvent id="endevent1" name="End"></endEvent>
...
</process>

4、补偿边界事件
使用了取消结束事件和取消边界事件,当事务子流程被取消时,会触发事务子流程里面的补偿边界事件,这些补偿边界事件会依附在事务子流程的活动中,除了在事务子流程中可以使用取消事件来触发补偿边界事件外,还可以使用补偿中间事件来触发补偿边界事件。

参考:边界事件

五、中间事件
中间事件是指可以单独作为流程元素的事件,BPMN2.0规范中所指的中间事件也包括边界事件。中间事件作为流程元素表示对事件的捕获与事件的触发,一类中间事件可以在流程中等待被触发,一类中间事件会在流程中自动被触发并抛出结果(触发信息)。
除了无指定Throwing中间事件外,其他事件均需要加入事件定义。

1、中间Catching事件
(1)定时器(Timer)中间事件
定时器中间事件一直等待被触发,当达到定义的时间条件后,该定时器中间事件会被触发,流程继续往下执行。
<process id="tcProcess" name="tcProcess">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="发货"></userTask>
<userTask id="usertask2" name="接收订单"></userTask>
<intermediateCatchEvent id="timerintermediatecatchevent1"
name="TimerCatchEvent">
<timerEventDefinition>
<timeDuration>PT1M</timeDuration>
</timerEventDefinition>
</intermediateCatchEvent>
<endEvent id="endevent1" name="End"></endEvent>
...
</process>

(2)信号(Signal)中间事件
一个信号中间Catching事件会等待被触发,直接到该事件接收到相应的信号,与其他事件不同的是,当信号事件接收到信号后,该信号不会被消耗掉,如果存在多个引用了相同信号的事件,那么当接收到信号时,这些事件被一并被触发,即使它们不在同一个流程实例中.

(3)消息(Message)中间事件

<intermediateCatchEvent id="myIntermediateCatchEvent" >
<XXXEventDefinition/>
</intermediateCatchEvent>

2、中间Throwing事件:
(1)无指定(None)中间事件
(2)信号(Signal)中间事件
(3)补偿(Compensation)中间事件

<intermediateThrowEvent id="myIntermediateThrowEvent" >
<XXXEventDefinition/>
</intermediateThrowEvent>

参考:中间事件

六、补偿中间事件

参考:补偿中间事件

参考:疯狂工作流讲义(第2版)基于Activiti6.x

【Activiti学习之五】BPMN事件的更多相关文章

  1. Activiti 学习笔记记录(二)

    上一篇:Activiti 学习笔记记录 导读:对于工作流引擎的使用,我们都知道,需要一个业务事件,比如请假,它会去走一个流程(提交申请->领导审批---(批,不批)---->结束),Act ...

  2. Activiti 学习笔记记录(2016-8-31)

    上一篇:Activiti 学习笔记记录(二) 导读:上一篇学习了bpmn 画图的常用图形标记.那如何用它们组成一个可用文件呢? 我们知道 bpmn 其实是一个xml 文件

  3. activiti学习资料(架构描述)

    Activiti学习资料 Activiti是业界很流行的java工作流引擎,关于Activiti与JBPM5的关系和如何选择不是本文要讨论的话题,相关内容可以baidu一下.Activiti从架构角度 ...

  4. Activiti学习——Activiti与Spring集成

    转: Activiti学习——Activiti与Spring集成 与Spring集成 基础准备 目录结构 相关jar包 Activiti的相关jar包 Activiti依赖的相关jar包 Spring ...

  5. Activiti学习之 多实例实现会签功

    转: Activiti学习之 多实例实现会签功能 2014年11月26日 11:27:11 程诺 阅读数:26185   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...

  6. activiti学习-用户与用户组

    activiti学习笔记3-用户与用户组 2015年05月07日 14:43:06 cq1982 阅读数:4142更多 个人分类: activiti工作流引擎   (本博客都是纯文本手工代码,错误难免 ...

  7. activiti学习7:spring和activiti进行整合

    目录 activiti学习7:spring和activiti进行整合 一.整合原理 二.整合步骤 2.1 新建一个maven工程并导入相关依赖 2.2 创建spring配置文件 三.测试 activi ...

  8. activiti学习5:开启流程和流程前进

    目录 activiti学习5:开启流程和流程前进 一.流程和任务的关系 二.开启流程 2.1根据流程定义key开启流程 三.查询用户任务 3.1 TaskQuery 四.完成任务 activiti学习 ...

  9. activiti学习4:流程文件的部署

    activiti学习4:流程文件的部署 用bpmn规范定义好一个流程得到流程定义文件后,需要把该文件部署到activiti的数据库后,这个流程才可以使用. activiti中和流程定义相关的操作都需要 ...

随机推荐

  1. python 练习题:将列表中的大写字母转换成小写

    将列表中的大写字母转换成小写如果list中既包含字符串,又包含整数,由于非字符串类型没有lower()方法,L1 = ['Hello', 'World', 18, 'Apple', None]请修改列 ...

  2. 在Visual studio上发布web项目,并添加到IIS服务器上。

    1.首先发布到IIS上 https://blog.csdn.net/kydkong/article/details/49563193 2.NET4.0部署出错HTTP 错误500.21 - Inter ...

  3. python每日经典算法题5(基础题)+1(较难题)

    一:基础算法题5道 1.阿姆斯特朗数 如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数.判断用户输入的数字是否为阿姆斯特朗数. (1)题目分析:这里要先得到该数是多少位的,然后再把 ...

  4. 2019 识装java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.识装等公司offer,岗位是Java后端开发,因为发展原因最终选择去了识装,入职一年时间了,也成为了面试官,之 ...

  5. React路由安装使用和多种方式传参

    安装路由 npm i react-router-dom -S 引入路由 import { BowserRouter as Router, Route, Switch, ... } from " ...

  6. LINUX开启SAMBA服务

    samba,用于网络文件共享,类似于nfs, samba多用于win和linux之间 linux之间多用nfs c/s架构 smb协议 samba主要是两个服务,核心启动服务SMB,监听139TCP端 ...

  7. druid + mysql + mybatis 批量更新报错

    首先 批量更新报错 sql injection violation, multi-statement not allow 然后看了博客:https://blog.csdn.net/qq_3634595 ...

  8. Windows 系统常用命令

    /** 环境变量配置 * sysdm.cpl */ /** 系统服务管理 * sservices.msc */ /** 远程服务器连接 * mstsc */ /** doc命令窗口 * doc */

  9. 【前端_js】jQuery动态设置元素的样式

    1.用css()方法查询元素的某个样式 $("div").css("padding-left")); 2.用css()方法设置元素的样式 法一: $(" ...

  10. 深浅拷贝、集合set、函数、日志

    #-----深浅拷贝---- import copy a = ["xiaoming",111,[5000,2000]] b = a print("b:%s" % ...