1 事件分类:
事件位置分类:开始事件,结束事件,中间事件,边界事件。
事件特性分类:Catching事件和Throwing事件。
事件的定义
2 定时器事件定义:
<timerEventDefinition>
<timeDate> :指定一个定时器触发的时间。
<timeDuration> :指定定时器激活后到定时器被运行的时间间隔。
<timeCycle>:指定定时器的重复间隔。timeCycle支持使用cron表达式设定重复间隔。
注一:使用ISO 8601格式日期时间。(同时表达日期和时间,需要在时间前加大写字母T:2017-06-30T10:23)
注二:完成corn表达式有7个域,以空格隔开。左至右为:秒,分,时,日,月,星期,年。其中年为可选项。
* :表示允许使用该域的全部值。
?:只允许出现在第4个域(日期)和第六个域(星期),表示不关心该域的取值(两个域可能存在冲突)。
- :表示范围,10-12表示10点到12点
, :表示一个域内并列多个值
/ :表示设置步长。
L :在第四个域,表示每月的最后一天。在第六给域,表示该星期的最后一天(周六)。另外如6L在第六个域,表示该月的最后一个星期5。
W:只能出现在第4个域,和其它值组合使用。15W :表示该月中与15号最接近的工作日。
#:只能出现在第六个域,表示改月的第几天。
>>>>还有很多,可在网上查找相关资料。
3 错误事件定义:
<errorEventDefinition>
<id> :该元素的唯一标识。
<name>:元素的名称。
<errorCode>:错误事件的编码,处理业务时抛出相应的异常代码,流程引擎会根据代码自动匹配到该error元素。
<structureRef>:结构引用属性。该属性引用公用的错误定义。
4 信号事件定义:
信号事件是一种引用了信号定义的事件,可以使用一个信号向全部的流程发送广播(流程定义使用了相同名称的信号)
<signalEventDefinition>
<id> :该元素的唯一标识。
<name>:元素的名称。
<structureRef>:结构引用属性。该属性引用公用的配置。
5 消息事件定义
<messageEventDefinition>
<id> :该元素的唯一标识。
<name>:元素的名称,使用runtimeService的messageEventReceived方法时传入该参数。
<itemRef>:指定该消息引用的itemDefinition元素。
6 取消事件定义:
<cancelEventDefinition>
7 补偿事件定义:
补偿机制:主要用于对已完成的流程作回退处理,因为这些流程的结果有可能不是所希望的,且希望能回退。
如果当前流程活动是激活状态的,则不能使用补偿机制,可以使用取消机制。
补偿事件:主要用于触发或者处理补偿机制。
<compensateEventDefinition>
<id>:元素Id
<waitForCompletion>:如果一个补偿事件被抛出,则该属性决定抛出的事件是否等待补偿完成。
<activitiRef>:在中间补偿事件的定义中设置该属性,则补偿只会针对指定的已完成的流程活动,
如果不指定该属性,则补偿会产生广播效果,即会触发全部符合条件的补偿事件。
流程事件:
一、开始事件(所有开始事件都是catching事件)
1 无指定开始事件: a、需要RuntimeService调用startProcessByXX启动。
b、子流程总会有一个无指定开始事件。
2 定时器开始事件:BPMN2.0规定:定时器开始事件可以使用在最高级流程和事件子流程中,不能在其它子流程中使用(嵌套子流程和调用子流程)
3 消息开始事件:使用RuntimeService的startProcessByMessage方法启动流程。消息事件定义引用的是message的Id,而startProcessByMessage
方法传入的参数是messag元素的name。
注:1> 全部流程定义,只能有一个引用了唯一消息的开始事件。
2> 如果一个流程有多个消息开始事件,则启动流程则由调用的API参数决定。
3> 如果一个流程既有消息开始事件,又有无指定开始事件,则在使用startProcessById或startProcessByKey时,将会使用无指定事件。
4> 如果一个流程中有多个消息开始事件,没有无指定开始事件,则在使用startProcessById或startProcessByKey时,将会抛异常。
5> 如果流程只有一个消息开始事件,则在使用startProcessById或startProcessByKey时,将会调用消息开始事件。
6> 如果被启动的流程是一个调用子流程且有多个开始事件,则该流程定义中除了含有消息开始事件,还需要有一个无指定的开始事件
或者该调用子流程中只有一个消息开始事件。
4 错误开始事件:BPMN2.0规定:错误开始事件只能使用在事件子流程中,不能使用在其它流程。
二、结束事件:
1 无指定结束事件
2 错误结束事件:当执行流到达错误结束事件时,会结束该执行流并抛出错误,该错误可以被错误边界事件捕获,
如果没有定义错误边界事件,则会被当做无指定错误事件执行。错误结束事件和错误边界事件需要一起使用才有意义。
错误结束事件触发错误边界事件,错误边界事件捕获错误结束事件抛出的错误信息。
3 取消结束事件和取消边界事件
取消结束事件只能使用在事务子流程中,表示事务将会取消,并且会触发依附在事务子流程上的取消边界事件。与错误结束事件相同,取消结束
事件会被抛出,而取消边界事件会捕获事件。除此之外,事务子流程的取消事件的触发,还会导致补偿的触发。在BPMN2.0中,对于已经完成的活动,
可以使用补偿机制,而对于活跃的活动,则不能使用补偿机制,而可以使用取消机制。当取消边界事件被触发,则会将当前的执行流中断,然后会同步
的进行补偿机制。取消边界事件在离开事件子流程前,会一直等待补偿的结束,当补偿结束后,执行流会从取消边界事件离开事务子流程。
三、边界事件:
边界事件是catching事件,当边界事件被触发,当前的活动会被中断,并且当前的顺序流会发生转移。
1 定时器边界事件:定时器边界事假是附属在流程活动中的事件,当流程到达流程活动时,定时器启动,当定时器边界事件触发后,
当前的活动会被中断,流程会从定时器边界事件离开流程活动。
注:想让定时器工作,必须启动activiti的JobExecutor,当流程到达附有定时器边界事件的流程活动时,activiti会向ACT_RU_JOB表中加如数据,
JobExecutor会按照定时器边界事件设定的时间来执行工作。
engine.getProcessEngineConfiguration().getjobExecutor().start();
2 错误边界事件:使用在嵌入子流程或调用子流程中。
错误边界事假定义加入errorRef属性,拥有引用一个是错误,在使用错误引用时,需要注意:
1 不使用该属性,则错误边界事件将会捕获任何的错误事件,而不管抛出的errorCode。
2 如果使用该属性,则该边界事件只会捕获与该”error“一样的errorCode。
3 如果errorRef属性引用了一个不存在的”error“,则引用的字符串会被当作errorCode。如果JavaDelegate的实现类抛出的字符串
和其相同则触发边界事件,否则找不到对应的Catching边界事件,对应的错误边界事件将不会被触发。
3、信号边界事件
信号边界事件具有全局性。信号边界事件会进行全局性的捕获,不同的流程实例均会捕获。
信号边界事件和定时器边界事件相同,可以通过设置cancleActivity属性,true表示原来的执行流会被中断。false表示原来的执行流任然存在。
4 补偿边界事件
触发方式:
a> 事务子流程中,使用取消事务来触发补偿边界事件。
b> 补偿中间事假,去触发补偿边界事件。
四:中间事件:
1 定时器中间事件:需要启动JobExecutor 。
2 信号中间Catching事件:多个引用了相同信号的事件或不同的流程实例,这些事件或流程实例均会被触发。
3 信号中间Throwing事件:(默认为false,为同步事件)
同步事件(默认):抛出信号时,捕获信号的catching事件将会在同一个事务中完成各自的工作,如果其一个信号catching事件
出现异常,则全部的信号事件均会失败。
异步事件:在信号事件定义元素(signalEventDefinition),设置activiti:async属性值为true。
表示单一的catching事件失败,不会影响其他已成功的事件。
4 消息中间事件: (activiti只对catching事件有实现)
使用RuntimeService的messageEventReceived方法发送消息,不同于信号事件,消息事件需要指定执行流。
5 无指定的中间事件:即一个Throwing事件。
6 补偿中间事件:补偿中间事件是一个Throwing事件。补偿中间事件主要用于触发当前所在执行流的全部补偿Catching事件(补偿边界事件)。
1 补偿执行次数:
如果补偿中间事件被触发,会触发当前的执行流的补偿事件。