activiti的流程事件

1 事件分类:

事件位置分类:开始事件,结束事件,中间事件,边界事件。

事件特性分类:Catching事件和Throwing事件。

事件的定义

2 定时器事件定义:

<timerEventDefinition>

<timeDate>  :指定一个定时器触发的时间。

<timeDuration> :指定定时器激活后到定时器被运行的时间间隔。

<timeCycle>:指定定时器的重复间隔。timeCycle支持使用cron表达式设定重复间隔。

注一:使用ISO 8601格式日期时间。(同时表达日期和时间,需要在时间前加大写字母T2017-06-30T10:23

注二:完成corn表达式有7个域,以空格隔开。左至右为:秒,分,时,日,月,星期,年。其中年为可选项。

扫描二维码关注公众号,回复: 5419798 查看本文章

*  :表示允许使用该域的全部值。

?:只允许出现在第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>:元素的名称,使用runtimeServicemessageEventReceived方法时传入该参数。

<itemRef>:指定该消息引用的itemDefinition元素。

6 取消事件定义:

<cancelEventDefinition>

7 补偿事件定义:

补偿机制:主要用于对已完成的流程作回退处理,因为这些流程的结果有可能不是所希望的,且希望能回退。

如果当前流程活动是激活状态的,则不能使用补偿机制,可以使用取消机制。

补偿事件:主要用于触发或者处理补偿机制。

<compensateEventDefinition>

<id>:元素Id

<waitForCompletion>:如果一个补偿事件被抛出,则该属性决定抛出的事件是否等待补偿完成。

<activitiRef>:在中间补偿事件的定义中设置该属性,则补偿只会针对指定的已完成的流程活动,

如果不指定该属性,则补偿会产生广播效果,即会触发全部符合条件的补偿事件。

流程事件:

一、开始事件(所有开始事件都是catching事件)

1 无指定开始事件: a、需要RuntimeService调用startProcessByXX启动。

b、子流程总会有一个无指定开始事件。

2 定时器开始事件:BPMN2.0规定:定时器开始事件可以使用在最高级流程和事件子流程中,不能在其它子流程中使用(嵌套子流程和调用子流程)

3 消息开始事件:使用RuntimeServicestartProcessByMessage方法启动流程。消息事件定义引用的是messageId,而startProcessByMessage

方法传入的参数是messag元素的name

注:1> 全部流程定义,只能有一个引用了唯一消息的开始事件。

2> 如果一个流程有多个消息开始事件,则启动流程则由调用的API参数决定。

3> 如果一个流程既有消息开始事件,又有无指定开始事件,则在使用startProcessByIdstartProcessByKey时,将会使用无指定事件。

4> 如果一个流程中有多个消息开始事件,没有无指定开始事件,则在使用startProcessByIdstartProcessByKey时,将会抛异常。

5> 如果流程只有一个消息开始事件,则在使用startProcessByIdstartProcessByKey时,将会调用消息开始事件。

6> 如果被启动的流程是一个调用子流程且有多个开始事件,则该流程定义中除了含有消息开始事件,还需要有一个无指定的开始事件

或者该调用子流程中只有一个消息开始事件。

4 错误开始事件:BPMN2.0规定:错误开始事件只能使用在事件子流程中,不能使用在其它流程。

二、结束事件:

1 无指定结束事件

2 错误结束事件:当执行流到达错误结束事件时,会结束该执行流并抛出错误,该错误可以被错误边界事件捕获,

如果没有定义错误边界事件,则会被当做无指定错误事件执行。错误结束事件和错误边界事件需要一起使用才有意义。

错误结束事件触发错误边界事件,错误边界事件捕获错误结束事件抛出的错误信息。

3 取消结束事件和取消边界事件

取消结束事件只能使用在事务子流程中,表示事务将会取消,并且会触发依附在事务子流程上的取消边界事件。与错误结束事件相同,取消结束

事件会被抛出,而取消边界事件会捕获事件。除此之外,事务子流程的取消事件的触发,还会导致补偿的触发。在BPMN2.0中,对于已经完成的活动,

可以使用补偿机制,而对于活跃的活动,则不能使用补偿机制,而可以使用取消机制。当取消边界事件被触发,则会将当前的执行流中断,然后会同步

的进行补偿机制。取消边界事件在离开事件子流程前,会一直等待补偿的结束,当补偿结束后,执行流会从取消边界事件离开事务子流程。

三、边界事件:

边界事件是catching事件,当边界事件被触发,当前的活动会被中断,并且当前的顺序流会发生转移。

1 定时器边界事件:定时器边界事假是附属在流程活动中的事件,当流程到达流程活动时,定时器启动,当定时器边界事件触发后,

当前的活动会被中断,流程会从定时器边界事件离开流程活动。

:想让定时器工作,必须启动activitiJobExecutor,当流程到达附有定时器边界事件的流程活动时,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事件有实现)

使用RuntimeServicemessageEventReceived方法发送消息,不同于信号事件,消息事件需要指定执行流。

5 无指定的中间事件:即一个Throwing事件。

6 补偿中间事件:补偿中间事件是一个Throwing事件。补偿中间事件主要用于触发当前所在执行流的全部补偿Catching事件(补偿边界事件)。

1 补偿执行次数:

如果补偿中间事件被触发,会触发当前的执行流的补偿事件。补偿的执行次数和对应的流程活动执行次数相等。

2 补偿执行范围:

附有补偿边界事件流程活动完成后,这个补偿边界事件的信息会保存到ACT_RU_SUBSCR表中,该事件描述数据的执行流ID表示

的为主流程的IDACR_RU_EXECUTION表中的IS_SCOPE_字段为1的执行流),执行流到达补偿中间事件时,会根据该事件所处的

执行流IDACT_RU_EVENT_SUBSCR表中查询,如果能查到相应补偿事件的描述,就会触发这些补偿事件,否则不会触发。如果在

没有子流程的情况下,触发补偿的中间事件所处的执行流,要与需要补偿的活动所在的执行流一致,才会触发补偿事件。

摘自疯狂的workflow,基于activiti工作流开发

猜你喜欢

转载自blog.csdn.net/u010009709/article/details/74177731