首页 > 代码库 > Activiti工作流学习-----基于5.19.0版本(8)

Activiti工作流学习-----基于5.19.0版本(8)

8.1.5 Start Event

继续上一篇的事件的分享笔记,Start Event指明该处是流程开始,至于开始事件的类型(消息到达开始,指定的事件循环开始等),定义如何开始是在开始事件圆圈图标里面的小图标表示,具体反映到xml中就是子元素的不同。

Start Event总是进行捕获:在任何时候等待相应的触发器触发。

下面展示start event的xml,其中initiator指的是流程发起人,流程开始后他将会被保存起来:

<startEvent id="request" activiti:initiator="xxx" />

而用户“xxx”在代码中实现同样的功能可以:

1 try {2   identityService.setAuthenticatedUserId("bono");3   runtimeService.startProcessInstanceByKey("someProcessKey");4 } finally {5   identityService.setAuthenticatedUserId(null);6 }

使用在try-catch中使用IdentityService.setAuthenticatedUserId(String)方法。

8.1.6 None Start Event

一个none start event说的是在流程定义中没有没有定义触发器。意味着流程引擎不会让流程实例自动开始,需要由开发人员调用API实现(一般子流程就是这个样子):

1 ProcessInstance processInstance = runtimeService.startProcessInstanceByXXX();

一个none start event在activiti可视化插件中的样子:

技术分享

而bpmn文件中则是

<startEvent id="start" name="my start event" />

可以配置formKey属性:

<startEvent id="request" activiti:formKey="org/activiti/examples/taskforms/request.form" />

8.1.7 Timer Start Event

timer start event作用是在指定的时间启动流程实例。它主要用在在流程只需要启动一次或者流程循环启动。注意:子流程是不能有timer start event。一般的在流程发布后就启动流程,这时没有必要调用startProcessInstanceByXXX方法了,尽管调用是没有限制的,但是导致同一时刻有多个流程实例运行。同时如果流程有新的版本发布,timer start event只会启动最新的版本的流程定义。

在activiti可视化插件中的样子:

技术分享

pbmn文件的xml格式中:

<startEvent id="theStart">  <timerEventDefinition>    <timeCycle>R4/2011-03-11T12:13/PT5M</timeCycle></timerEventDefinition></startEvent>

或者指定事件启动:

<startEvent id="theStart">  <timerEventDefinition>    <timeDate>2011-03-11T12:13:14</timeDate>  </timerEventDefinition></startEvent>

8.1.7  Message Start Event

一个Message Start Event会使用命名的消息启动流程实例,在有很多start event时候通过消息命名可以选择正确的start event来启动流程实例用到。

在发布流程定义一个或者多个的时候,需要注意一些问题:

每个message start event的名称在流程定义中确保唯一的,在流程定义中没有必要使得多个message start event的名字相同。在多个message start event引用的消息都相同的时候,工作流会抛出异常。

升级流程版本后,此前的message start event将会被新版本的message start event代替。

调用RunTimeService的API:

ProcessInstance startProcessInstanceByMessage(String messageName);ProcessInstance startProcessInstanceByMessage(String messageName, Map<String, Object> processVariables);ProcessInstance startProcessInstanceByMessage(String messageName, String businessKey, Map<String, Object< processVariables);

其中messageName是messageEventDefinition中messageRef引用message节点中name的值。message start event只支持顶层流程,不支持子流程。调用runtimeService.startProcessInstanceByMessage(…?)可以选定message event。对于使用方法runtimeService.startProcessInstanceByKey(…?) 和runtimeService.startProcessInstanceById(…?)是使用了none start event,如果此时定义了多个message event会抛出异常。

技术分享

 例如在messageEventDefinition节点中配置:

<definitions id="definitions"  xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"  xmlns:activiti="http://activiti.org/bpmn"  targetNamespace="Examples"  xmlns:tns="Examples">  <message id="newInvoice" name="newInvoiceMessage" />  <process id="invoiceProcess">    <startEvent id="messageStart" >        <messageEventDefinition messageRef="tns:newInvoice" />    </startEvent>    ...  </process></definitions>

 8.1.8 Signal Start Event

使用命名的信号进行启动流程实例,信号在在流程中间信号抛出或者调用API(runtimeService.signalEventReceivedXXX方法)触发,所有的流程定义如果有相同名称的信号事件,都会被启动。另外在这两种情况下,都可以选择同步或异步的方式启动流程实例。

其中调用API的参数signalName来自流程定义中signalEventDefinition节点的signalRef的配置,而signalRef来自signal的属性name。signal start event的可视化符号为下图所示:

技术分享

解析为xml:

 1 <signal id="theSignal" name="The Signal" /> 2  3 <process id="processWithSignalStart1"> 4   <startEvent id="theStart"> 5     <signalEventDefinition id="theSignalEventDefinition" signalRef="theSignal"  /> 6   </startEvent> 7   <sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask" /> 8   <userTask id="theTask" name="Task in process A" /> 9   <sequenceFlow id="flow2" sourceRef="theTask" targetRef="theEnd" />10       <endEvent id="theEnd" />11 </process>

8.1.9 Error Start Event

一个error start event在子流程中常用,并且它并不能用在启动一个流程实例。错误开始事件都是中断事件。error start event的可视化符号为下图所示:

技术分享

解析为xml为:

1 <startEvent id="messageStart" >2     <errorEventDefinition errorRef="someError" />3 </startEvent>

一个结束事件常常用在流程和子流程中,并且end event总是往外抛出信息,意味着流程执行到结束事件的时候会有结果抛出。

8.2.1 None End Event

空的结束事件意味着并没有指定的结果抛出,所以流程引擎在当前执行路径下面并不会执行任何额外的事情。一个none end event的可视化效果。

技术分享

<endEvent id="end" name="my end event" />

8.2.2 Error End Event

如果流程执行到error end event,当前路径执行将会提前结束并抛出一个错误,这个错误会被匹配的边界事件所捕获,如果没有找到对应的边界事件,将会抛出异常,他具体的可视化效果下图所示:

技术分享

xml解析为:

<endEvent id="myErrorEndEvent">  <errorEventDefinition errorRef="myError" /></endEvent>

errorRef引用的myError是在error中配置的:

<error id="myError" errorCode="123" />...<process id="myProcess">...

其中error的errorCode将会被匹配边界事件,如果errorRef并没有找到对于的error,errorRef将会作为errorCode的短名,这在Activiti中是特有的,比如:

<error id="myError" errorCode="error123" />...<process id="myProcess">...  <endEvent id="myErrorEndEvent">    <errorEventDefinition errorRef="myError" />  </endEvent>...

等效于:

<endEvent id="myErrorEndEvent">  <errorEventDefinition errorRef="error123" /></endEvent>

8.2.3 Terminate End Event

 当流程执行到terminate end event的时候,当前流程和子流程都将会终止结束。从概念上讲,当执行到终止结束事件的时候,流程实例和子流程会结束,在BPMN2.0中,一个子流程会可以嵌入到子流程、含事务的子流程中,这适用于一般情况。当例如有多实例调用活动或嵌入的子流程,此时只有该实例将结束,其他实例和流程实例不受影响。流程设计器中设计可视化效果为:

技术分享

解析为xml的话:

<endEvent id="myEndEvent >  <terminateEventDefinition activiti:terminateAll="true"></terminateEventDefinition></endEvent>

 

Activiti工作流学习-----基于5.19.0版本(8)