基于Activiti6.0工作流结束退回
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Activiti6.0工作流结束退回相关的知识,希望对你有一定的参考价值。
参考技术A 工作流结束退回,一般是跨流程使用,一般有其他解决方案,Activiti本身不支持退回;正常退回操作,在流程图画退回流程即可,但是,有些时候,我们只有正向流程,通过代码进行反向退回操作。话不多说,上代码!
通过以上代码,可以实现平滑的工作流退回操作。不喜勿喷
Activiti工作流学习-----基于5.19.0版本
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>