本文节选自《疯狂工作流讲义(第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
BPMN结束事件
结束事件表示流程的结束,因此结束事件并不允许有输出的顺序流,BPMN2.0规定没有顺序流可以从结束事件中输出。根据前面的章节所述,结束事件总是抛出事件,这些事件会自动执行并反馈结果,并不需要触发。BPMN2.0中定义了多种结束事件,包括:无指定(None)结束事件、消息(Message)结束事件、升级(Escalation)结束事件、错误(Error)取消事件、取消(Cancel)结束事件、补偿(Compensation)结束事件、信号(Signal)结束事件、终止(Terminate)结束事件和组合(Multiple)结束事件,目前Activiti支持无指定结束事件、错误结束事件、取消结束事件和终止结束事件。
无指定结束事件
与无指定开始事件一样,无指定结束事件,是指流程在结束时,不会进行任何的额外操作,结束事件中不使用任何事件的定义。图11-5为结束事件的图形。
图11-5 结束事件的图形
在流程描述文件中,使用endEvent元素定义一件结束事件,代码清单11-14为一个简单的流程配置内容,该段配置的粗体字代码,定义了一个无指定结束事件。
代码清单11-14:codes\11\11.4\end-event\resource\bpmn\NoneEndEvent.bpmn
<process id="myProcess" name="myProcess">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="User Task"></userTask>
<endEvent id="endevent1" name="End"></endEvent>
<sequenceFlow id="flow1" name="" sourceRef="startevent1"
targetRef="usertask1"></sequenceFlow>
<sequenceFlow id="flow2" name="" sourceRef="usertask1"
targetRef="endevent1"></sequenceFlow>
</process>
错误结束事件
当执行流到达错误结束事件时,会结束该执行流并且抛出错误,该错误可以被“错误边界事件”捕获,如果没有定义任何的错误边界事件,那么将会被当作无指定错误事件执行,因此,错误结束事件一般使用在子流程当中。错误事件结束后,就会触发依附在该子流程上的错误边界事件。图11-6定义了一个含有错误结束事件和错误边界事件的流程。
图11-6 含有错误结束事件和错误边界事件的流程
如图11-6所示,该流程一启动,就会进入一个嵌套子流程,当完成了“Sub Task”的用户任务后,会遇到单向网关,此时会产生两个分支,一个分支会正常结束该子流程,另外一个分支会触发错误结束事件,如果正常结束该子流程,流程会到达“End Task”任务,而触发错误结束事件后,流程会到达“Error Task”任务。该流程图对应的流程文件如代码清单11-15所示。
代码清单11-15:codes\11\11.4\end-event\resource\bpmn\ErrorEndEvent.bpmn
<error id="myError" errorCode="myError"></error>
<process id="errorEndProcess" name="errorEndProcess">
<startEvent id="startevent1" name="Start"></startEvent>
<subProcess id="subprocess1" name="Sub Process">
<startEvent id="startevent2" name="Start"></startEvent>
<userTask id="usertask1" name="Sub Task"></userTask>
<endEvent id="endevent1" name="ErrorEnd">
<errorEventDefinition errorRef="myError"></errorEventDefinition>
</endEvent>
<sequenceFlow id="flow2" name="" sourceRef="startevent2"
targetRef="usertask1"></sequenceFlow>
<exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway>
<endEvent id="endevent3" name="End"></endEvent>
<sequenceFlow id="flow7" name="" sourceRef="usertask1"
targetRef="exclusivegateway1"></sequenceFlow>
<sequenceFlow id="flow8" name="" sourceRef="exclusivegateway1"
targetRef="endevent3">
<conditionExpression xsi:type="tFormalExpression">${success == true}
</conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow9" name="" sourceRef="exclusivegateway1"
targetRef="endevent1">
<conditionExpression xsi:type="tFormalExpression">${success ==
false}</conditionExpression>
</sequenceFlow>