本文节选自《疯狂工作流讲义(第2版)》
京东购买地址:https://item.jd.com/12246565.html
工作流Activiti6电子书:http://blog.csdn.net/boxiong86/article/details/78488562
工作流Activiti6教学视频:http://blog.csdn.net/boxiong86/article/details/78608585
中间事件
本书所称的中间事件是指可以单独作为流程元素的事件,BPMN2.0规范中所指的中间事件也包括边界事件。中间事件作为流程元素表示对事件的捕获与事件的触发,一类中间事件可以在流程中等待被触发,一类中间事件会在流程中自动被触发并抛出结果(触发信息)。
中间事件分类
中间事件按照其特性可以分为两类:中间Catching事件和中间Throwing事件,当流程到达中间Catching事件时,它会一直在等待被触发,直接接收到的信息,才会被触发,而当流程到达中间Throwing事件时,该事件会自动被触发并抛出相应的结果或者信息。
BPMN2.0中定义的中间Catching事件有:消息(Message)中间事件、定时器(Timer)中间事件、条件(Conditional)中间事件、连接(Link)中间事件、信号(Signal)中间事件、组合(Multiple)中间事件和并行(Parallel Multiple)中间事件。
BPMN2.0中定义的中间Throwing事件有:无指定(None)中间事件、消息(Message)中间事件、升级(Escalation)中间事件、补偿(Compensation)中间事件、连接(Link)中间事件、信号(Signal)中间事件和组合(Multiple)中间事件。
Activiti支持的中间Catching事件有定时器(Timer)中间事件、信号(Signal)中间事件和消息(Message)中间事件,支持的中间Throwing事件有无指定(None)中间事件、信号(Signal)中间事件和补偿(Compensation)中间事件。除了无指定Throwing中间事件外,其他事件均需要加入事件定义。使用intermediateCatchEvent元素定义一个中间Catching事件,如以下配置片断:
<intermediateCatchEvent id="myIntermediateCatchEvent" >
<XXXEventDefinition/>
</intermediateCatchEvent>
使用intermediateThrowEvent元素定义一个中间Throwing事件,如以下配置片断:
<intermediateThrowEvent id="myIntermediateThrowEvent" >
<XXXEventDefinition/>
</intermediateThrowEvent>
定时器中间事件
定时器中间事件是一个Catching事件,该事件会一直等待被触发,当达到定义的时间条件后,该定时器中间事件会被触发,流程继续往下执行。假设现在有一个接收订单的业务,当接收到订单后,需要给一定的时间让相关的业务部门(例如仓库、物流或者生产)准备,然后进行发货,此时可以加入定时器中间事件定义流程自动向下执行的时间间隔,图11-13表示该业务流程,代码清单11-31为该流程对应的文件内容。
图11-13 含有定时器中间事件的流程
代码清单11-31:codes\11\11.6\intermediate-event\resource\bpmn\TimerCatchingEvent.bpmn
<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>
<sequenceFlow id="flow1" name="" sourceRef="startevent1"
targetRef="usertask2"></sequenceFlow>
<sequenceFlow id="flow2" name="" sourceRef="usertask2"
targetRef="timerintermediatecatchevent1"></sequenceFlow>
<sequenceFlow id="flow3" name=""
sourceRef="timerintermediatecatchevent1" targetRef="usertask1"></sequenceFlow>
<sequenceFlow id="flow4" name="" sourceRef="usertask1"
targetRef="endevent1"></sequenceFlow>
</process>
代码清单11-31的粗体字代码,定义了一个定时器中间事件,使用了timeDuration元素,<