边界事件
边界事件是绑定在活动上的“捕获型”事件,会一直监听所有处于活动中的某种事件的触发,在捕获到事件之后中断活动,然后从边界事件类型的输出流继续执行。
- 一旦边界事件触发,当前活动就会被中断,然后按照边界事件之后的输出流继续执行。
- 边界事件和所关联的活动有一个特殊的关系附加,而且一个活动只能绑定一个边界事件,每个边界事件类型都是听过属性 attachedToRef 指定附加到抛出边界事件的活动上。
对应的XML:
<boundaryEvent attachedToRef="someActivity" id="boundaryId" cancelActivity="false">
</boundaryEvent>
定时器边界事件
定时器边界事件和定时器启动事件类似,只不过两者的应用场景不同,定时器启动事件应用于在一个指定的时间启动一个新的流程,而定时器边界事件需要附属在一个非自动任务,调用活动,子流程上,在上游任务执行完成之后开始倒计时预设时间。
对于的XML
<boundaryEvent attachedToRef="someActivity" id="boundaryId" cancelActivity="false">
<timerEventDefinition>
<timeDuration>P3D</timeDuration>
</timerEventDefinition>
</boundaryEvent>
对应的示例图:
异常边界事件
异常边界事件用来捕获嵌入子流程或者调用活动抛出的异常。异常在抛出之后被主流程的异常边界事件捕获,同时嵌入子流程或者调用活动中的活动也被中断执行。
对应的XML
<subProcess id="subProcess1">
<endEvent id="endEvent" name="error">
<errorEventDefinition errorRef="A001">
</errorEventDefinition>
</endEvent>
</subProcess>
<boundaryEvent attachedToRef="subProcess1" id="boundaryId1">
<errorEventDefinition errorRef="A001"></errorEventDefinition>
</boundaryEvent>
对应的实例图:
信号边界事件
信号边界事件可以捕获流程执行过程中抛出的信号,可以附加在各自活动和子流程上。信号边界事件是全局的。
取消边界事件
取消边界事件是专门针对事物子流程所设立的,用来捕获子流程中抛出的取消事件。
补偿边界事件
补偿边界事件用于事物子流程中针对事物失败后的业务逻辑进行补偿。
中间捕获事件
中间捕获事件就是流程的拦路虎,根据事件类型的不同需要使用不同的方式才能继续执行后续的输出流活动。
定时器中间捕获事件
定时器中间捕获事件和定时启动事件,定时器边界事件的功能,配置参数的方式都类似,都是在一个特定的时间或者时间间隔之后被触发。
信号中间捕获事件
信号中间捕获事件用来捕获被当前流程或者其他流程抛出的信号事件,捕获的条件就是信号的ID一致。
消息中间捕获事件
消息中间捕获事件和信号中间捕获事件类似,不同的是信号事件是广播式传播,而消息中间捕获事件是定向一对一的传递。
中间抛出事件
中间抛出事件和中间捕获事件是两个相互依赖的关系,中间捕获事件需要有事件抛出才能被触发,而中间抛出司机需要有对于的捕获事件接收才有意义。
空中间抛出事件
空中间抛出事件是BPMN规范中没有任务功能的事件,因此执行到空中间抛出事件时直接跳过。
信号间抛出事件
信号中间抛出事件可以抛出一个信号,然后交给引擎传播信号事件。
事件类型太多了我也搞不清到底有啥用,先把它罗列出来,等到真正使用的时候,再来好好查一下。
监听器
监听器是activiti 在BPMN规范的基础上扩展的功能,是业务和流程非浸入式的粘合剂。
监听器分为两类:执行监听器和任务监听器。
执行监听器
执行监听器允许在执行过程中执行Java代码。
执行监听器可以捕获事件的类型:
流程实例启动,结束
输出流捕获
获取启动,结束
路由开始,结束
中间事件开始,结束
触发开始事件,触发结束事件
监听器执行类 | 属性说明和实例 | |
---|---|---|
class | 需要实现接口 ExecutionListener <activiti:executionListener event="end" class="com.xiaoyuxixi.TaskListener"></activiti:executionListener> | |
expression | 定义一个表达式,类似于el表达式 <activiti:executionListener event="end" expression="${pojo.method(execution.eventName)}"></activiti:executionListener> | |
delegateExpression | 利用spring代理实现,<activiti:executionListener event="end" delegateExpression="${procinstCompleteListener}"></activiti:executionListener> |
选择一种就好,通常我们都使用最后一种。
任务监听器
相对于执行监听器的使用范围,任务监听器的范围就要小得多,因为他只能用于用户任务。
- create 在任务被创建且所有任务属性设置完成之后才触发
- assignment 在任务被分配给某个办理人之后触发,需要注意的是,assignment事件总是在create事件被触发之前触发
- 在配置了监听器的上一个任务完成时触发,也就是在运行时数据被删除的时候触发。
监听器执行类 | 属性说明和实例 | |
---|---|---|
class | 需要实现接口 TaskListener | |
expression | 定义一个表达式,类似于el表达式 <taskListener event="end" expression="${pojo.method(execution.eventName)}"></activiti:executionListener> | |
delegateExpression | 利用spring代理实现,<activiti:taskListener event="assignment" delegateExpression="${taskAssignmentListener}" </activiti:taskListener> |
好了,activiti理论部门终于告一段落了,后面都是对这些理论的一些实践。理论确实枯燥了些,可是没有理论的指导,也出不了实践的真知。