Activiti 启动事件(Start Event)
Activiti 启动事件(Start Event)
作者:Jesai
生活里,没有容易二字,忧伤是一种本能,而微笑是一种能力
版权所有,未经允许,禁止引用。如需引用,请注明出处。
前言:
启动事件是Activiti活动的开始节点。现在有很多国产的工作流是省略了开始和结束这两个节点的。但是BPMBN 2.0标准是必须要有开始和结束节点的。启动事件表示流程的开始。 定义了流程如何被启动的启动事件类型(当收到消息、特定的时是以一个小图标来形象表示事件的。在 XML 表示中,类型是由子元素的声明给出的。启动事件总是捕获型的:从概念上讲,该事件(任何时候) 会一直等待直到触发发生。
启动事件(Start Event)的类型:
(1)空启动事件(None Satrt Event)
(2)定时启动事件(Timer Satrt Event)
(3)信号事件(Signal Start Event)
(4)消息事件(Message Start Event)
(5)异常事件(Error Start Event)
(1)空启动事件(None Satrt Event)
图标:
图 1-1 空启动事件图标
空启动事件就是一个圆圈。在工作流里面使用的非常多。但是空启动事件必须要人工去启动一个流程。空启动事件是建立在部署完成的流程上面的。每启动一次,就会产生一个新的流程实例。
代码:
<startEventid="start"name="my start event"/>
这个启动事件非常的简单。就无需多说。
(2)定时启动事件(Timer Satrt Event)
图标:
图 2-1 定时启动事件图标
定时启动事件是一个时钟图标,注意的是,这个时钟图标是比较少圆圈的,要跟定时边界事件区分清楚。
定时器启动事件用于在给定的时间点创建流程实例。它可以用在只启动一次的流程中,也可以用在特定时间间隔下启动。如果是有重复执行的,流程在周期内都有效,可以重复利用。
的流程。
注意:
子流程中不能使用定时器启动事件。 定时器是从流程部署开始计时,不需要去启动流程。
代码:
timeDate:指定ISO 8601格式的日期定时器激活。
<timerEventDefinition> <timeDate>2016-08-23T18:13:00</timeDate></timerEventDefinition>
timeDuration:定义定时器经过多少时间后激活。时间段也是取得ISO 8601格式,比如在一年三个月五天六小时七分三十秒内,可以写成P1Y3M5DT6H7M30S。
<timerEventDefinition> <timeDuration>P10D</timeDuration></timerEventDefinition>
timeCycle:定义定时器重复间隔,在某些场景使用,比如周期性的启动流程,任务超时发送提醒。timeCycle的设置目前有两种方式:ISO 8601和Cron表达式(quartz任务调度框架提供的解决方案),activiti默认是使用ISO 8601。例如现在重复三次,每次间隔10小时:
<timerEventDefinition>2 <timeCycle activiti:endDate="2016-08-22T16:42:11+00:00">R3/PT10H</timeCycle>3 </timerEventDefinition> <timerEventDefinition> <timeCycle>R3/PT10H/${EndDate}</timeCycle> </timerEventDefinition>
其中endDate是可选的配置,上面使用了两张方式加上了endDate, 定时器将会在指定的时间停止工作。
此外如果你使用Cron 表达式,可以这样写:
0 0/5 * * * ?
注意:
第一个数字表示秒,而不是像通常Unix cron中那样表示分钟。重复的时间周期能更好的处理相对时间,它可以计算一些特定的时间点 (比如用户任务的开始时间),而cron表达式可以处理绝对时间, 这对定时启动事件特别有用。
你可以使用表达式进行配置,在里面动态设置值,不过该值需要为ISO 8601或者(cron表达式)格式
<boundaryEvent id="escalationTimer" cancelActivity="true" attachedToRef="firstLineSupport"> <timerEventDefinition> <timeDuration>${duration}</timeDuration> </timerEventDefinition></boundaryEvent>
示例:从 2011 年 3 月 11 日 12:13 开始,流程将启动 4 次,每次间隔 5 分钟。
<startEventid="theStart">
<timerEventDefinition>
<timeCycle>R4/2017-06-11T12:13/PT5M</timeCycle>
</timerEventDefinition>
</startEvent>
示例: 流程将在选定的时间上启动一次
<startEventid="theStart">
<timerEventDefinition>
<timeDate>2017-06-11T12:13:14</timeDate>
</timerEventDefinition>
</startEvent>
实验:
我们设计一个简单的流程,一个定时启动事件,一个手动任务来监控定时启动任务是否已经启动。
流程设计:
图 2-2定时启动事件流程设计
流程代码:
<?xml version='1.0' encoding='UTF-8'?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef"> <process id="process" isExecutable="true"> <startEvent id="sid-B51BA61F-F3FA-489E-8E50-87AEED50C3B3"> <timerEventDefinition> <timeCycle>R4/2017-06-27T20:45/PT1M</timeCycle> </timerEventDefinition> </startEvent> <manualTask id="sid-15215C7C-14D0-4460-9BB1-4DE865EA03A7" name="手工任务"> <extensionElements> <activiti:executionListener event="start" class="light.mvc.workflow.serviceTask.TimerTestRunningTask" /> </extensionElements> </manualTask> <endEvent id="sid-11AC64F4-17C1-489A-9BED-0FCCDBAF5602" /> <sequenceFlow id="sid-15E29826-5274-4586-A743-A728B87EBB00" sourceRef="sid-15215C7C-14D0-4460-9BB1-4DE865EA03A7" targetRef="sid-11AC64F4-17C1-489A-9BED-0FCCDBAF5602" /> <sequenceFlow id="sid-228F25A5-209F-4239-852E-F0B734F115A4" sourceRef="sid-B51BA61F-F3FA-489E-8E50-87AEED50C3B3" targetRef="sid-15215C7C-14D0-4460-9BB1-4DE865EA03A7" /> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_process"> <bpmndi:BPMNPlane bpmnElement="process" id="BPMNPlane_process"> <bpmndi:BPMNShape bpmnElement="sid-B51BA61F-F3FA-489E-8E50-87AEED50C3B3" id="BPMNShape_sid-B51BA61F-F3FA-489E-8E50-87AEED50C3B3"> <omgdc:Bounds height="31.0" width="31.0" x="161.25" y="91.5" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="sid-15215C7C-14D0-4460-9BB1-4DE865EA03A7" id="BPMNShape_sid-15215C7C-14D0-4460-9BB1-4DE865EA03A7"> <omgdc:Bounds height="80.0" width="100.0" x="313.75" y="67.0" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="sid-11AC64F4-17C1-489A-9BED-0FCCDBAF5602" id="BPMNShape_sid-11AC64F4-17C1-489A-9BED-0FCCDBAF5602"> <omgdc:Bounds height="28.0" width="28.0" x="458.75" y="93.0" /> </bpmndi:BPMNShape> <bpmndi:BPMNEdge bpmnElement="sid-228F25A5-209F-4239-852E-F0B734F115A4" id="BPMNEdge_sid-228F25A5-209F-4239-852E-F0B734F115A4"> <omgdi:waypoint x="193.24994249971698" y="107.457104711797" /> <omgdi:waypoint x="313.75" y="107.13404825737265" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="sid-15E29826-5274-4586-A743-A728B87EBB00" id="BPMNEdge_sid-15E29826-5274-4586-A743-A728B87EBB00"> <omgdi:waypoint x="413.75" y="107.0" /> <omgdi:waypoint x="458.75" y="107.0" /> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions>
手动任务监听器代码:
/** * */ package light.mvc.workflow.serviceTask; import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.delegate.JavaDelegate; /** * * 项目名称:lightmvc * 类名称:ServiceTask * 类描述: * 创建人:邓家海 * 创建时间:2017年6月4日 下午6:18:11 * 修改人:deng * 修改时间:2017年6月4日 下午6:18:11 * 修改备注: * @version * */ public class TimerTestRunningTask implements JavaDelegate{ //重写委托的提交方法 @Override public void execute(DelegateExecution execution) throws Exception { //receiveTaskprocess System.out.println("TimerTestRunningTask is running!"); } }
部署流程,无需启动。
运行结果:
图 2-3定时启动事件运行结果
注意的是,当定时启动任务已经超过运行时间,再次去部署流程里面启动这个任务,就会把它当成一个普通的空启动事件来处理。部署新的流程,上一版本的流程就会被移除。
(3)信号事件(Signal Start Event)
信号启动事件,使用具名信号启动流程实例。这个信号可以由流程实例中的信号抛出中间事件(intermediary signal throw event),或
者API(runtimeService.signalEventReceivedXXX方法)触发。这些情况下,所有拥有相同名字信号启动事件的流程定义都会被启动。
请注意这些情况下,都可以选择异步还是同步启动流程实例。
需要为API传递的 signalName ,是由 signal 元素的 name 属性决定的名字。 signal 元素被 signalEventDefinition 的 signalRef
属性所引用。
图标:
图 3-1 信号启动事件图标
信号事件流程图设计:
图 3-2 信号启动流程设计
信号事件的启动:
List<Execution> executions = execution.getEngineServices().getRuntimeService().createExecutionQuery() .signalEventSubscriptionName("singal") .list(); for(Execution e:executions){ execution.getEngineServices().getRuntimeService().signalEventReceived("singal", e.getId()); }
信号事件XML代码:
<signal id="theSignal" name="The Signal" />
<process id="processWithSignalStart1">
<startEvent id="theStart">
<signalEventDefinition id="theSignalEventDefinition" signalRef="theSignal" />
</startEvent>
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask" />
<userTask id="theTask" name="Task in process A" />
<sequenceFlow id="flow2" sourceRef="theTask" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
说明:
信号启动事件的两种启动方式:
1、信号可以是流程实例中抛出的信号事件
2、API触发
信号事件的执行方式:
1、异步执行
2、同步执行
注意:信号启动事件,是所有相同名称的信号事件都会被执行!
(4)消息事件(Message Start Event )
启动方式:
1、流程实例中的信号抛出事件
2、API触发(runtimeService.signalEventReceivedXXX方法)触发
注意事项:
1)流程的消息名称必须是唯一的,一个流程定义不得包含多个同名的启动消息。否则部署流程的时候就会抛异常。
2)消息启动事件,在所有部署的流程里面必须要唯一,否则也会抛异常。
3)直接启动消息定义事件,会当作一个普通启动事件执行。
4)新版本发布,会取消上一版本的消息订阅。
5)启动流程实例的三种方法
ProcessInstance startProcessInstanceByMessage(String messageName);
ProcessInstance startProcessInstanceByMessage(String messageName, Map<String, Object> processVariables);
ProcessInstance startProcessInstanceByMessage(String messageName, String businessKey, Map<String, Object<
processVariables);
注:messageName 是由 message 元素的 name 属性决定的名字。 message 元素被 messageEventDefinition 的 messageRef 属性引用
6)只有顶层流程(toplevel process)才支持消息启动事件 ,嵌入流程(子流程)不支持消息事件。
7)如果一个流程定义多个消息事件无法使用runtimeService.startProcessInstanceByKey(…) 与
runtimeService.startProcessInstanceById(…) 启动消息事件,但是一个流程定义单个消息事件可以启动。如果同一个流程定义同时具有多个消息事件和空启动事件,就会启动空启动事件,同一个流程定义多个消息事件的时候,使用这个方法启动,就会抛异常。
图标:
图 4-1 消息启动事件图标
流程图设计:
图 4-2 消息启动事件流程设计
我们在消息启动事件后面放置了一个手工任务,并在这个手工任务上面设置一个监听类,这个任务只要是监控这个启动事件的流程是否被成功的执行。
流程代码:
<?xml version='1.0' encoding='UTF-8'?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef"> <message id="message" name="messages" /> <process id="process" isExecutable="true"> <startEvent id="startEven" name="MessageTask"> <messageEventDefinition messageRef="message" /> </startEvent> <manualTask id="sid-CB1E9115-3038-4E4D-901B-3FFE85996ADB" name="手动任务"> <extensionElements> <activiti:executionListener event="start" class="light.mvc.workflow.serviceTask.MessageTestRunningTask" /> </extensionElements> </manualTask> <endEvent id="sid-EB3FFCA5-960F-4BD1-A765-67AEAD90B862" /> <sequenceFlow id="sid-3A543EA6-7A84-4CA1-80AE-0F9C40F7F208" sourceRef="sid-CB1E9115-3038-4E4D-901B-3FFE85996ADB" targetRef="sid-EB3FFCA5-960F-4BD1-A765-67AEAD90B862" /> <sequenceFlow id="sid-1169B143-B2B1-4460-A357-50EA0D53CA6A" sourceRef="startEven" targetRef="sid-CB1E9115-3038-4E4D-901B-3FFE85996ADB" /> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_process"> <bpmndi:BPMNPlane bpmnElement="process" id="BPMNPlane_process"> <bpmndi:BPMNShape bpmnElement="startEven" id="BPMNShape_startEven"> <omgdc:Bounds height="30.0" width="30.5" x="237.5" y="116.0" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="sid-CB1E9115-3038-4E4D-901B-3FFE85996ADB" id="BPMNShape_sid-CB1E9115-3038-4E4D-901B-3FFE85996ADB"> <omgdc:Bounds height="80.0" width="100.0" x="344.75" y="88.0" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="sid-EB3FFCA5-960F-4BD1-A765-67AEAD90B862" id="BPMNShape_sid-EB3FFCA5-960F-4BD1-A765-67AEAD90B862"> <omgdc:Bounds height="28.0" width="28.0" x="540.0" y="114.0" /> </bpmndi:BPMNShape> <bpmndi:BPMNEdge bpmnElement="sid-3A543EA6-7A84-4CA1-80AE-0F9C40F7F208" id="BPMNEdge_sid-3A543EA6-7A84-4CA1-80AE-0F9C40F7F208"> <omgdi:waypoint x="444.75" y="128.0" /> <omgdi:waypoint x="540.0" y="128.0" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="sid-1169B143-B2B1-4460-A357-50EA0D53CA6A" id="BPMNEdge_sid-1169B143-B2B1-4460-A357-50EA0D53CA6A"> <omgdi:waypoint x="268.4965298183317" y="130.67203111495593" /> <omgdi:waypoint x="344.75" y="129.05820105820106" /> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions>
我们测试的时候借助一个手工任务触发消息事件的流程。
手工任务流程设计:
图 4-3 手工任务事件流程设计
手工任务流程代码:
<?xml version='1.0' encoding='UTF-8'?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef"> <process id="process" isExecutable="true"> <startEvent id="sid-8D52A572-DD68-4640-BCEE-AA46FD19F535" /> <manualTask id="sid-B57FA289-A98B-45B8-8550-211ED155778E" name="手工任务"> <extensionElements> <activiti:executionListener event="start" class="light.mvc.workflow.serviceTask.ServiceTask" /> </extensionElements> </manualTask> <endEvent id="sid-DF898F06-5F35-4C64-B84D-6A405ADECA91" /> <sequenceFlow id="sid-BD48A7F5-D206-4E76-AB78-0437FBDC5834" sourceRef="sid-B57FA289-A98B-45B8-8550-211ED155778E" targetRef="sid-DF898F06-5F35-4C64-B84D-6A405ADECA91" /> <sequenceFlow id="sid-6F9CC662-16AB-4058-BA4A-2A0D3D99C185" sourceRef="sid-8D52A572-DD68-4640-BCEE-AA46FD19F535" targetRef="sid-B57FA289-A98B-45B8-8550-211ED155778E" /> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_process"> <bpmndi:BPMNPlane bpmnElement="process" id="BPMNPlane_process"> <bpmndi:BPMNShape bpmnElement="sid-8D52A572-DD68-4640-BCEE-AA46FD19F535" id="BPMNShape_sid-8D52A572-DD68-4640-BCEE-AA46FD19F535"> <omgdc:Bounds height="30.0" width="30.0" x="233.75" y="102.0" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="sid-B57FA289-A98B-45B8-8550-211ED155778E" id="BPMNShape_sid-B57FA289-A98B-45B8-8550-211ED155778E"> <omgdc:Bounds height="80.0" width="100.0" x="375.0" y="77.0" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="sid-DF898F06-5F35-4C64-B84D-6A405ADECA91" id="BPMNShape_sid-DF898F06-5F35-4C64-B84D-6A405ADECA91"> <omgdc:Bounds height="28.0" width="28.0" x="630.0" y="103.0" /> </bpmndi:BPMNShape> <bpmndi:BPMNEdge bpmnElement="sid-BD48A7F5-D206-4E76-AB78-0437FBDC5834" id="BPMNEdge_sid-BD48A7F5-D206-4E76-AB78-0437FBDC5834"> <omgdi:waypoint x="475.0" y="117.0" /> <omgdi:waypoint x="630.0" y="117.0" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="sid-6F9CC662-16AB-4058-BA4A-2A0D3D99C185" id="BPMNEdge_sid-6F9CC662-16AB-4058-BA4A-2A0D3D99C185"> <omgdi:waypoint x="263.75" y="117.0" /> <omgdi:waypoint x="375.0" y="117.0" /> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions>
手工任务监听类:
/** * */ package light.mvc.workflow.serviceTask; import java.util.List; import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.delegate.JavaDelegate; import org.activiti.engine.runtime.Execution; /** * * 项目名称:lightmvc * 类名称:ServiceTask * 类描述: * 创建人:邓家海 * 创建时间:2017年6月4日 下午6:18:11 * 修改人:deng * 修改时间:2017年6月4日 下午6:18:11 * 修改备注: * @version * */ public class TestRunningTask implements JavaDelegate{ //重写委托的提交方法 @Override public void execute(DelegateExecution execution) throws Exception { execution.getEngineServices().getRuntimeService().startProcessInstanceByMessage("message"); System.out.println("TestRunningTask is running!"); } }
消息事件执行测试代码(监听类):
/** * */ package light.mvc.workflow.serviceTask; import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.delegate.JavaDelegate; /** * * 项目名称:lightmvc * 类名称:ServiceTask * 类描述: * 创建人:邓家海 * 创建时间:2017年6月4日 下午6:18:11 * 修改人:deng * 修改时间:2017年6月4日 下午6:18:11 * 修改备注: * @version * */ public class MessageTestRunningTask implements JavaDelegate{ //重写委托的提交方法 @Override public void execute(DelegateExecution execution) throws Exception { //receiveTaskprocess System.out.println("MessageTestRunningTask is running!"); } }
运行结果:
图 4-4 消息事件执行结果
(5)异常事件(错误启动事件 Error Start Event )
BPMN2.0规定了错误开始事件只能使用在事件子流程(Event Sub-Process)中,该该事件不能使用在其他流程中,包括最高级流程(Top-Level Process)、嵌套子流程(Sub-Process)和调用子流程(Call Activity)。BPMN错误与Java异常不是一回事。事实上,这两者毫无共同点。BPMN错误事件是建模业务异常(business exceptions)的方式。
错误消息开始事件图标:
图 5-1 异常事件图标
错误事件定义 Error Event Definitions :
error的errorCode用于查找匹配的错误捕获边界事件。如果errorRef不匹配任何已定义的error,则该errorRef会用做errorCode的快捷方式。
请注意errorRef必须遵从BPMN 2.0概要(schema),且必须是合法的QName。
下面这两段代码是一样的
1)
<error id="myError" errorCode="error123" />
...
<process id="myProcess">
...
<endEvent id="myErrorEndEvent">
<errorEventDefinition errorRef="myError" />
</endEvent>
2)
<endEvent id="myErrorEndEvent">
<errorEventDefinition errorRef="error123" />
</endEvent>
错误启动事件流程图设计:
图 5-2 异常事件流程设计
说明:
我们一共设计两个流程,一个是子流程事件,一个是主流程。当这个流程启动,便会启动主流程。主流程的Servertask便会抛出一个BpmnError的流程错误。这个流程错误会被Activiti引擎拦截到,然户触发子流程事件里面的错误启动事件。从而触发SubServertask这个Server任务。
图解:
图 5-3 异常事件图解
流程图XML定义:
<?xml version='1.0' encoding='UTF-8'?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef"> <process id="test2" name="test" isExecutable="true"> <subProcess id="sid-79BC7EB5-33E8-45BF-9572-2B74EAEECA04" name="subProcess" triggeredByEvent="true"> <startEvent id="errorId" name="error"> <errorEventDefinition errorRef="MyErrorCode" /> </startEvent> <serviceTask id="Sub" name="SubServer task" activiti:class="light.mvc.workflow.serviceTask.ErrorTestRunningTask" /> <endEvent id="sid-7511716A-8CE6-4BA6-94B4-77F5C6976148" /> <sequenceFlow id="sid-C0C5E2A2-2859-4A00-A14D-B74D12C4F992" sourceRef="Sub" targetRef="sid-7511716A-8CE6-4BA6-94B4-77F5C6976148" /> <sequenceFlow id="sid-B6D21933-0380-4829-BF96-1D4206F33507" sourceRef="errorId" targetRef="Sub" /> </subProcess> <startEvent id="sid-7DB721F7-4F4D-4C4B-AC8F-C9ED7EF64D76" /> <serviceTask id="pro" name="Servertask" activiti:class="light.mvc.workflow.serviceTask.TestRunningTask" /> <endEvent id="sid-C3FC8A02-7A8A-4E38-AC2A-31444F3167FF" /> <sequenceFlow id="sid-3544F586-2757-45DB-9D17-2AB72EBB1535" sourceRef="pro" targetRef="sid-C3FC8A02-7A8A-4E38-AC2A-31444F3167FF" /> <sequenceFlow id="sid-D638FB68-7AB5-48D1-9B0D-4C74B1351B6D" sourceRef="sid-7DB721F7-4F4D-4C4B-AC8F-C9ED7EF64D76" targetRef="pro" /> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_test2"> <bpmndi:BPMNPlane bpmnElement="test2" id="BPMNPlane_test2"> <bpmndi:BPMNShape bpmnElement="sid-79BC7EB5-33E8-45BF-9572-2B74EAEECA04" id="BPMNShape_sid-79BC7EB5-33E8-45BF-9572-2B74EAEECA04"> <omgdc:Bounds height="128.0" width="434.0" x="165.0" y="30.0" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="errorId" id="BPMNShape_errorId"> <omgdc:Bounds height="30.0" width="30.0" x="228.75" y="68.0" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="Sub" id="BPMNShape_Sub"> <omgdc:Bounds height="80.0" width="100.0" x="332.0" y="44.0" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="sid-7511716A-8CE6-4BA6-94B4-77F5C6976148" id="BPMNShape_sid-7511716A-8CE6-4BA6-94B4-77F5C6976148"> <omgdc:Bounds height="28.0" width="28.0" x="461.75" y="70.0" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="sid-7DB721F7-4F4D-4C4B-AC8F-C9ED7EF64D76" id="BPMNShape_sid-7DB721F7-4F4D-4C4B-AC8F-C9ED7EF64D76"> <omgdc:Bounds height="30.0" width="30.0" x="231.75" y="196.0" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="pro" id="BPMNShape_pro"> <omgdc:Bounds height="80.0" width="100.0" x="316.75" y="172.0" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="sid-C3FC8A02-7A8A-4E38-AC2A-31444F3167FF" id="BPMNShape_sid-C3FC8A02-7A8A-4E38-AC2A-31444F3167FF"> <omgdc:Bounds height="28.0" width="28.0" x="461.75" y="198.0" /> </bpmndi:BPMNShape> <bpmndi:BPMNEdge bpmnElement="sid-C0C5E2A2-2859-4A00-A14D-B74D12C4F992" id="BPMNEdge_sid-C0C5E2A2-2859-4A00-A14D-B74D12C4F992"> <omgdi:waypoint x="432.0" y="84.0" /> <omgdi:waypoint x="461.75" y="84.0" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="sid-B6D21933-0380-4829-BF96-1D4206F33507" id="BPMNEdge_sid-B6D21933-0380-4829-BF96-1D4206F33507"> <omgdi:waypoint x="258.749607613604" y="83.10849625760292" /> <omgdi:waypoint x="332.0" y="83.63833634719711" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="sid-3544F586-2757-45DB-9D17-2AB72EBB1535" id="BPMNEdge_sid-3544F586-2757-45DB-9D17-2AB72EBB1535"> <omgdi:waypoint x="416.75" y="212.0" /> <omgdi:waypoint x="461.75" y="212.0" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="sid-D638FB68-7AB5-48D1-9B0D-4C74B1351B6D" id="BPMNEdge_sid-D638FB68-7AB5-48D1-9B0D-4C74B1351B6D"> <omgdi:waypoint x="261.74947919379184" y="211.12499565994827" /> <omgdi:waypoint x="316.75" y="211.58333333333331" /> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions>
主流程的监听类:
/** * */ package light.mvc.workflow.serviceTask; import org.activiti.engine.delegate.BpmnError; import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.delegate.JavaDelegate; /** * * 项目名称:lightmvc * 类名称:ServiceTask * 类描述: * 创建人:邓家海 * 创建时间:2017年6月4日 下午6:18:11 * 修改人:deng * 修改时间:2017年7月16日 下午7:28:11 * 修改备注: * @version * */ public class TestRunningTask implements JavaDelegate{ //重写委托的提交方法 @Override public void execute(DelegateExecution execution) throws Exception{ System.out.println("TestRunningTask is running!"); //throw new BpmnError("myError","myError"); throw new BpmnError("MyErrorCode","myError"); } }
子流程事件的监听类:
/** * */ package light.mvc.workflow.serviceTask; import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.delegate.JavaDelegate; /** * * 项目名称:lightmvc * 类名称:ServiceTask * 类描述: * 创建人:邓家海 * 创建时间:2017年6月4日 下午6:18:11 * 修改人:deng * 修改时间:2017年6月4日 下午6:18:11 * 修改备注: * @version * */ public class ErrorTestRunningTask implements JavaDelegate{ //重写委托的提交方法 @Override public void execute(DelegateExecution execution) throws Exception { //receiveTaskprocess System.out.println("ErrorTestRunningTask is running!"); } }
运行结果:
图 5-4 异常事件执行结果
到这里,五个启动事件都介绍完了。接下来就网关了。
Activiti交流QQ群:634320089
Activiti 启动事件(Start Event)的更多相关文章
- Caddy源码阅读(二)启动流程与 Event 事件通知
Caddy源码阅读(二)启动流程与 Event 事件通知 Preface Caddy 是 Go 语言构建的轻量配置化服务器.https://github.com/caddyserver/caddy C ...
- Activiti结束事件(End Event)
Activiti结束事件(End Event) 作者:Jesai -2017.08.03T01:03 曾经,黑夜多么漫长,八月雨扰眠,缘何? 声明:版权所有,如需引用请注明出处,如发现抄袭,必追究法律 ...
- python笔记12-python多线程之事件(Event)
前言 小伙伴a,b,c围着吃火锅,当菜上齐了,请客的主人说:开吃!,于是小伙伴一起动筷子,这种场景如何实现 Event(事件) Event(事件):事件处理的机制:全局定义了一个内置标志Flag,如果 ...
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
- mysql 事件(Event) 总结
1 事件简介 事件(event)是MySQL在相应的时刻调用的过程式数据库对象.一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器”. 事件和触发器类似,都是在 ...
- 【周期性执行事件】MySQL事件(Event)&任务调度
1.事件简介 事件(event)是MySQL在相应的时刻调用的过程式数据库对象.一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器”. 事件和触发器类似,都是在 ...
- Sprinboot优雅配置监听,并记录所有启动事件
在阅读Springboot启动源码的时候,发现Springboot自动启动listeners是通过uopeizhi文件配置的,本文就是采用Springboot方式自动装入listeners. 项目依赖 ...
- 简单了解一下事件循环(Event Loop)
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...
- Spring Boot 启动事件和监听器,太强大了!
大家都知道,在 Spring 框架中事件和监听无处不在,打通了 Spring 框架的任督二脉,事件和监听也是 Spring 框架必学的核心知识之一. 一般来说,我们很少会使用到应用程序事件,但我们也不 ...
随机推荐
- jQuery-自己封装的弹框
(function () { CDK={ cfm:function(resFun,errFun){ var confirm=document.createElement('div'); confirm ...
- jQuery 工具类函数-使用$.extend()扩展Object对象
除使用$.extend扩展工具函数外,还可以扩展原有的Object对象,在扩展对象时,两个对象将进行合并,当存在相同属性名时,后者将覆盖前者,调用格式为: $. extend (obj1,obj2,… ...
- 2018-9-14-win10-UWP-标题栏后退
title author date CreateTime categories win10 UWP 标题栏后退 lindexi 2018-9-14 20:22:8 +0800 2018-2-13 17 ...
- CSS 高度居中方案
实现高度自适应并且上下居中 <div id="wrap"> <div class="box">DemoSeat</div> ...
- Lede定时重拨
系统,计划任务, 0 4 * * * ifup wan 梅林定时重拨: #! /bin/sh #断开拨号连接 killall pppd #延时10秒 #重新拨号 pppd >& &a ...
- HttpServletRequest,HttpServletResponse
1, Java中HttpServletRequest接口是ServletRequest子接口,HttpServletRequest接口遵循http协议.相比于HttpServletRequest接口, ...
- saltstack的配置使用
介绍 认证管理,使其可以用于编配, 远程执行, 配置管理等等.部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯. 号称世界上最快的消息队列ZeroMQ使得 ...
- 020 ceph作openstack的后端存储
一.使用ceph做glance后端 1.1 创建用于存储镜像的池 [root@serverc ~]# ceph osd pool create images 128 128 pool 'images ...
- 使用SonarQube+Eclipse来分析python代码
背景 最近在项目中推广集成测试的理念以及相关工具,在jenkins中集成sonar去分析项目的java代码的时候,意外的发现,sonarqube上还有对应python的插件,而自己写的测试工具大部分都 ...
- 10道java经典算法题,每一题都能帮你提升java水平!
JAVA经典算法题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: ...