基于事件的网关 Eventbased Gateway
作者:Jesai
时间:2018年4月21日 21:19:30
什么是事件网关?
基于事件的网关,允许基于事件做选择。
事件网关的执行原理?
网关的每一条出口顺序流,都需要连接至一个捕获中间事件。当流程执行到达基于事件的网关时,网关类似等待状态地动作:执行被暂停。并且,为每一条出口顺序流,创建一个事件订阅。流程的走向完全是由于中间事件的选择。而由哪一个事件来决定流程的走向则是由最先触发的事件来决定的。
事件网关和其他网关的区别
请注意基于事件的网关,其出口顺序流与一般的顺序流不同。这些顺序流从不实际被执行。相反,它们允许流程引擎决定,当执行到达一个基于事件的网关时,需要订阅什么事件。
约束:
1)一个基于事件的网关,必须有两条或更多的出口顺序流。
2)基于事件的网关,只能连接至 intermediateCatchEvent(捕获中间事件) 类型的元素(Activiti不支持基于事件的网关后,连接接收任务,Receive Task)。
3)连接至基于事件的网关的 intermediateCatchEvent ,必须只有一个入口顺序流。
图标:
基于事件的网关,用内部带有特殊图标的网关(菱形)表示。
定义:
用于定义基于事件的网关的XML元素为
1 eventBasedGateway 。
流程设计
我们设计一个有三个走向(分支)的事件网关。后面紧接着定时器事件、信号事件和消息事件。然后在分别跟着三个task任务。三个task任务可以告知我们流程是怎么走的。Task任务上面的监听器可以更加详细的让我们知道整个流程的执行过程。
流程配置
时间事件的CRON表达式配置
R4/2018-05-27T14:42/PT1M
这个表达式的意思是从2018-05-27日的14点42分开始,每分钟执行一次,一共执行4次。
设计流程表达式的时候设置CRON表达式。
在流程里面定义新增一个信号引用,并在信号事件里面引用。
在流程定义里面定义一个消息事件,并在消息事件里面去引用。
给时间事件增加一个执行监听器和任务监听器
给信号事件增加一个执行监听器和任务监听器
给消息事件增加一个执行监听器和任务监听器
在上面所示,每一个任务我们都配置了执行监听器和任务执行器。你会发现,我配置的类都是同一个类。你就往下看,你会发现,我这三个任务里面的执行监听器和任务监听器执行的代码都是一样的。唯一不同的是任务监听器实现的是TaskListener,执行监听器实现的是ExecutionListener。细心的就会发现,监听器实现的事件也不一样。任务监听器的事件是Create···,执行监听器的事件是:start···。后面我将会有一个环节专门介绍这两者的区别。
流程定义:
1 <?xml version='1.0' encoding='UTF-8'?>
2
3 <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://activiti.org/test">
4
5 <signal id="Singal" name="Singal" />
6
7 <message id="Message" name="Message" />
8
9 <process id="EventGateWay" name="事件网关" isExecutable="true">
10
11 <startEvent id="sid-23B0551D-A771-4EE7-84D5-2FDE120C597F" />
12
13 <endEvent id="sid-CFDD8A12-89F8-4114-8781-5506EC5F74D6" />
14
15 <exclusiveGateway id="sid-5474F8B6-BDE6-4BCD-9792-9B06B283519C" />
16
17 <intermediateCatchEvent id="sid-4F686F4E-C053-47EC-8FBF-028C8561B63B" name="定时器事件">
18
19 <timerEventDefinition>
20
21 <timeCycle>R4/2018-05-28T15:13/PT1M</timeCycle>
22
23 </timerEventDefinition>
24
25 </intermediateCatchEvent>
26
27 <eventBasedGateway id="sid-3C4E8072-F03C-45B0-BF54-0842204B5984" />
28
29 <intermediateCatchEvent id="Singals" name="信号事件">
30
31 <signalEventDefinition signalRef="Singal" />
32
33 </intermediateCatchEvent>
34
35 <sequenceFlow id="sid-ADE687E7-F6C2-491D-A9DD-3A4274C2E67F" sourceRef="sid-3C4E8072-F03C-45B0-BF54-0842204B5984" targetRef="Singals" />
36
37 <sequenceFlow id="sid-398D02FE-4E17-4683-A2AD-DFC2B834A674" sourceRef="sid-23B0551D-A771-4EE7-84D5-2FDE120C597F" targetRef="sid-3C4E8072-F03C-45B0-BF54-0842204B5984" />
38
39 <intermediateCatchEvent id="Messages" name="消息事件">
40
41 <messageEventDefinition messageRef="Message" />
42
43 </intermediateCatchEvent>
44
45 <userTask id="sid-C3D1F9C5-C11D-4A09-9EEC-F28FA2759449" name="定时器事件触发了" activiti:assignee="admin">
46
47 <extensionElements>
48
49 <activiti:executionListener event="start" class="light.mvc.workflow.taskListener.TimerListenerImpl" />
50
51 <activiti:taskListener event="create" class="light.mvc.workflow.taskListener.TimerListenerImpl" />
52
53 </extensionElements>
54
55 </userTask>
56
57 <userTask id="sid-88AF77E1-D75B-4085-A244-1A772C42893E" name="信号事件触发了" activiti:assignee="admin">
58
59 <extensionElements>
60
61 <activiti:executionListener event="start" class="light.mvc.workflow.taskListener.SingalListenerImpl" />
62
63 <activiti:taskListener event="create" class="light.mvc.workflow.taskListener.SingalListenerImpl" />
64
65 </extensionElements>
66
67 </userTask>
68
69 <userTask id="sid-881FDB4C-571D-4330-A753-7C1BC87C3130" name="消息事件触发了" activiti:assignee="admin">
70
71 <extensionElements>
72
73 <activiti:executionListener event="start" class="light.mvc.workflow.taskListener.MessageListenerImpl" />
74
75 <activiti:taskListener event="create" class="light.mvc.workflow.taskListener.MessageListenerImpl" />
76
77 </extensionElements>
78
79 </userTask>
80
81 <sequenceFlow id="sid-A96EE6F9-F2E8-4B0B-8128-0808651C69AC" sourceRef="sid-5474F8B6-BDE6-4BCD-9792-9B06B283519C" targetRef="sid-CFDD8A12-89F8-4114-8781-5506EC5F74D6" />
82
83 <sequenceFlow id="sid-C4CD2E72-679C-4AB4-87EA-F364B033A8B6" sourceRef="sid-4F686F4E-C053-47EC-8FBF-028C8561B63B" targetRef="sid-C3D1F9C5-C11D-4A09-9EEC-F28FA2759449" />
84
85 <sequenceFlow id="sid-F4CA6F5B-B634-4D59-9824-B4F98634C6A1" sourceRef="Singals" targetRef="sid-88AF77E1-D75B-4085-A244-1A772C42893E" />
86
87 <sequenceFlow id="sid-2B33C971-D5F7-4CF9-85FF-F8264BA62600" sourceRef="sid-88AF77E1-D75B-4085-A244-1A772C42893E" targetRef="sid-5474F8B6-BDE6-4BCD-9792-9B06B283519C" />
88
89 <sequenceFlow id="sid-6B3C1D12-6792-476E-ABFA-2EC780C20B5F" sourceRef="Messages" targetRef="sid-881FDB4C-571D-4330-A753-7C1BC87C3130" />
90
91 <sequenceFlow id="sid-DDCEBFC5-7E85-4738-94D7-7D0E6A678C8C" sourceRef="sid-3C4E8072-F03C-45B0-BF54-0842204B5984" targetRef="sid-4F686F4E-C053-47EC-8FBF-028C8561B63B" />
92
93 <sequenceFlow id="sid-ED0B6AA2-8677-4791-AD6B-637553A690F1" sourceRef="sid-3C4E8072-F03C-45B0-BF54-0842204B5984" targetRef="Messages" />
94
95 <sequenceFlow id="sid-308B7959-1F2B-43A9-8237-893103EB7B7D" sourceRef="sid-C3D1F9C5-C11D-4A09-9EEC-F28FA2759449" targetRef="sid-5474F8B6-BDE6-4BCD-9792-9B06B283519C" />
96
97 <sequenceFlow id="sid-E9416900-EBFC-4DB2-8A49-495BBE0C5B96" sourceRef="sid-881FDB4C-571D-4330-A753-7C1BC87C3130" targetRef="sid-5474F8B6-BDE6-4BCD-9792-9B06B283519C" />
98
99 </process>
100
101 <bpmndi:BPMNDiagram id="BPMNDiagram_EventGateWay">
102
103 <bpmndi:BPMNPlane bpmnElement="EventGateWay" id="BPMNPlane_EventGateWay">
104
105 <bpmndi:BPMNShape bpmnElement="sid-23B0551D-A771-4EE7-84D5-2FDE120C597F" id="BPMNShape_sid-23B0551D-A771-4EE7-84D5-2FDE120C597F">
106
107 <omgdc:Bounds height="30.0" width="30.0" x="135.0" y="195.0" />
108
109 </bpmndi:BPMNShape>
110
111 <bpmndi:BPMNShape bpmnElement="sid-CFDD8A12-89F8-4114-8781-5506EC5F74D6" id="BPMNShape_sid-CFDD8A12-89F8-4114-8781-5506EC5F74D6">
112
113 <omgdc:Bounds height="28.0" width="28.0" x="870.0" y="196.0" />
114
115 </bpmndi:BPMNShape>
116
117 <bpmndi:BPMNShape bpmnElement="sid-5474F8B6-BDE6-4BCD-9792-9B06B283519C" id="BPMNShape_sid-5474F8B6-BDE6-4BCD-9792-9B06B283519C">
118
119 <omgdc:Bounds height="40.0" width="40.0" x="750.0" y="190.00000487674356" />
120
121 </bpmndi:BPMNShape>
122
123 <bpmndi:BPMNShape bpmnElement="sid-4F686F4E-C053-47EC-8FBF-028C8561B63B" id="BPMNShape_sid-4F686F4E-C053-47EC-8FBF-028C8561B63B">
124
125 <omgdc:Bounds height="31.0" width="31.0" x="390.0" y="90.0" />
126
127 </bpmndi:BPMNShape>
128
129 <bpmndi:BPMNShape bpmnElement="sid-3C4E8072-F03C-45B0-BF54-0842204B5984" id="BPMNShape_sid-3C4E8072-F03C-45B0-BF54-0842204B5984">
130
131 <omgdc:Bounds height="40.0" width="40.0" x="240.0" y="190.0" />
132
133 </bpmndi:BPMNShape>
134
135 <bpmndi:BPMNShape bpmnElement="Singals" id="BPMNShape_Singals">
136
137 <omgdc:Bounds height="30.0" width="30.0" x="390.0" y="195.0" />
138
139 </bpmndi:BPMNShape>
140
141 <bpmndi:BPMNShape bpmnElement="Messages" id="BPMNShape_Messages">
142
143 <omgdc:Bounds height="30.0" width="30.0" x="390.5" y="295.0" />
144
145 </bpmndi:BPMNShape>
146
147 <bpmndi:BPMNShape bpmnElement="sid-C3D1F9C5-C11D-4A09-9EEC-F28FA2759449" id="BPMNShape_sid-C3D1F9C5-C11D-4A09-9EEC-F28FA2759449">
148
149 <omgdc:Bounds height="80.0" width="100.0" x="555.0" y="65.5" />
150
151 </bpmndi:BPMNShape>
152
153 <bpmndi:BPMNShape bpmnElement="sid-88AF77E1-D75B-4085-A244-1A772C42893E" id="BPMNShape_sid-88AF77E1-D75B-4085-A244-1A772C42893E">
154
155 <omgdc:Bounds height="80.0" width="100.0" x="555.0" y="170.0" />
156
157 </bpmndi:BPMNShape>
158
159 <bpmndi:BPMNShape bpmnElement="sid-881FDB4C-571D-4330-A753-7C1BC87C3130" id="BPMNShape_sid-881FDB4C-571D-4330-A753-7C1BC87C3130">
160
161 <omgdc:Bounds height="80.0" width="100.0" x="555.0" y="270.0" />
162
163 </bpmndi:BPMNShape>
164
165 <bpmndi:BPMNEdge bpmnElement="sid-398D02FE-4E17-4683-A2AD-DFC2B834A674" id="BPMNEdge_sid-398D02FE-4E17-4683-A2AD-DFC2B834A674">
166
167 <omgdi:waypoint x="165.0" y="210.0000003694503" />
168
169 <omgdi:waypoint x="240.0000022167019" y="210.0000022167019" />
170
171 </bpmndi:BPMNEdge>
172
173 <bpmndi:BPMNEdge bpmnElement="sid-2B33C971-D5F7-4CF9-85FF-F8264BA62600" id="BPMNEdge_sid-2B33C971-D5F7-4CF9-85FF-F8264BA62600">
174
175 <omgdi:waypoint x="655.0" y="210.00000147780108" />
176
177 <omgdi:waypoint x="750.0000005911204" y="210.00000428562313" />
178
179 </bpmndi:BPMNEdge>
180
181 <bpmndi:BPMNEdge bpmnElement="sid-A96EE6F9-F2E8-4B0B-8128-0808651C69AC" id="BPMNEdge_sid-A96EE6F9-F2E8-4B0B-8128-0808651C69AC">
182
183 <omgdi:waypoint x="789.5840716200719" y="210.41593325667168" />
184
185 <omgdi:waypoint x="870.0001358465071" y="210.06167401189862" />
186
187 </bpmndi:BPMNEdge>
188
189 <bpmndi:BPMNEdge bpmnElement="sid-F4CA6F5B-B634-4D59-9824-B4F98634C6A1" id="BPMNEdge_sid-F4CA6F5B-B634-4D59-9824-B4F98634C6A1">
190
191 <omgdi:waypoint x="420.0" y="210.0" />
192
193 <omgdi:waypoint x="555.0" y="210.0" />
194
195 </bpmndi:BPMNEdge>
196
197 <bpmndi:BPMNEdge bpmnElement="sid-ED0B6AA2-8677-4791-AD6B-637553A690F1" id="BPMNEdge_sid-ED0B6AA2-8677-4791-AD6B-637553A690F1">
198
199 <omgdi:waypoint x="260.5" y="229.5" />
200
201 <omgdi:waypoint x="260.5" y="310.0" />
202
203 <omgdi:waypoint x="390.5" y="310.0" />
204
205 </bpmndi:BPMNEdge>
206
207 <bpmndi:BPMNEdge bpmnElement="sid-308B7959-1F2B-43A9-8237-893103EB7B7D" id="BPMNEdge_sid-308B7959-1F2B-43A9-8237-893103EB7B7D">
208
209 <omgdi:waypoint x="655.0" y="105.5" />
210
211 <omgdi:waypoint x="770.0" y="105.5" />
212
213 <omgdi:waypoint x="770.0" y="190.00000487674356" />
214
215 </bpmndi:BPMNEdge>
216
217 <bpmndi:BPMNEdge bpmnElement="sid-ADE687E7-F6C2-491D-A9DD-3A4274C2E67F" id="BPMNEdge_sid-ADE687E7-F6C2-491D-A9DD-3A4274C2E67F">
218
219 <omgdi:waypoint x="279.56597222222223" y="210.43402777777777" />
220
221 <omgdi:waypoint x="390.00008979696906" y="210.0519028034707" />
222
223 </bpmndi:BPMNEdge>
224
225 <bpmndi:BPMNEdge bpmnElement="sid-DDCEBFC5-7E85-4738-94D7-7D0E6A678C8C" id="BPMNEdge_sid-DDCEBFC5-7E85-4738-94D7-7D0E6A678C8C">
226
227 <omgdi:waypoint x="260.5" y="190.5" />
228
229 <omgdi:waypoint x="260.5" y="106.0" />
230
231 <omgdi:waypoint x="390.0" y="106.0" />
232
233 </bpmndi:BPMNEdge>
234
235 <bpmndi:BPMNEdge bpmnElement="sid-C4CD2E72-679C-4AB4-87EA-F364B033A8B6" id="BPMNEdge_sid-C4CD2E72-679C-4AB4-87EA-F364B033A8B6">
236
237 <omgdi:waypoint x="421.99994949646396" y="105.95979912186817" />
238
239 <omgdi:waypoint x="555.0" y="105.62562814070353" />
240
241 </bpmndi:BPMNEdge>
242
243 <bpmndi:BPMNEdge bpmnElement="sid-E9416900-EBFC-4DB2-8A49-495BBE0C5B96" id="BPMNEdge_sid-E9416900-EBFC-4DB2-8A49-495BBE0C5B96">
244
245 <omgdi:waypoint x="655.0" y="310.0" />
246
247 <omgdi:waypoint x="770.0" y="310.0" />
248
249 <omgdi:waypoint x="770.0" y="230.00000487674356" />
250
251 </bpmndi:BPMNEdge>
252
253 <bpmndi:BPMNEdge bpmnElement="sid-6B3C1D12-6792-476E-ABFA-2EC780C20B5F" id="BPMNEdge_sid-6B3C1D12-6792-476E-ABFA-2EC780C20B5F">
254
255 <omgdi:waypoint x="420.5" y="310.0" />
256
257 <omgdi:waypoint x="555.0" y="310.0" />
258
259 </bpmndi:BPMNEdge>
260
261 </bpmndi:BPMNPlane>
262
263 </bpmndi:BPMNDiagram>
264
265 </definitions>
流程监听类
1. MessageListenerImpl
1 package light.mvc.workflow.taskListener;
2
3
4
5 import org.activiti.engine.delegate.DelegateExecution;
6
7 import org.activiti.engine.delegate.DelegateTask;
8
9 import org.activiti.engine.delegate.ExecutionListener;
10
11 import org.activiti.engine.delegate.JavaDelegate;
12
13 import org.activiti.engine.delegate.TaskListener;
14
15
16
17 public class MessageListenerImpl implements TaskListener,ExecutionListener {
18
19
20
21 @Override
22
23 public void notify(DelegateTask arg0) {
24
25 System.out.println("Message Event Task Is Running");
26
27
28
29 }
30
31
32
33 @Override
34
35 public void notify(DelegateExecution arg0) throws Exception {
36
37 // TODO Auto-generated method stub
38
39 System.out.println("Message Event Execution Is Running");
40
41 }
42
43
44
45 }
2. SingalListenerImpl
1 package light.mvc.workflow.taskListener;
2
3
4
5 import org.activiti.engine.delegate.DelegateExecution;
6
7 import org.activiti.engine.delegate.DelegateTask;
8
9 import org.activiti.engine.delegate.ExecutionListener;
10
11 import org.activiti.engine.delegate.JavaDelegate;
12
13 import org.activiti.engine.delegate.TaskListener;
14
15
16
17 public class SingalListenerImpl implements TaskListener,ExecutionListener {
18
19
20
21 @Override
22
23 public void notify(DelegateTask arg0) {
24
25 System.out.println("Singal Event Task Is Running");
26
27
28
29 }
30
31
32
33 @Override
34
35 public void notify(DelegateExecution arg0) throws Exception {
36
37 // TODO Auto-generated method stub
38
39 System.out.println("Singal Event Execution Is Running");
40
41 }
42
43
44
45
46
47
48
49 }
3. TimerListenerImpl
1 package light.mvc.workflow.taskListener;
2
3
4
5 import org.activiti.engine.delegate.DelegateExecution;
6
7 import org.activiti.engine.delegate.DelegateTask;
8
9 import org.activiti.engine.delegate.ExecutionListener;
10
11 import org.activiti.engine.delegate.JavaDelegate;
12
13 import org.activiti.engine.delegate.TaskListener;
14
15
16
17 public class TimerListenerImpl implements TaskListener,ExecutionListener {
18
19
20
21 @Override
22
23 public void notify(DelegateTask arg0) {
24
25 System.out.println("Timer Event Task Is Running");
26
27
28
29 }
30
31
32
33
34
35 @Override
36
37 public void notify(DelegateExecution arg0) throws Exception {
38
39 // TODO Auto-generated method stub
40
41 System.out.println("Timer Event Execution Is Running");
42
43 }
44
45
46
47 }
通过以上代码,我们会发现,其实代码都很简单,只是往控制台打印一句话,告诉我们,这个网关事件是怎么走的。
我们启动流程,稍微等待时间,就会发现流程自动往下执行了。此时,定时事件已经触发。
通过执行的顺序,你会发现是先执行Execution ,再执行Task。由此可见。执行监听器比任务监听器更早触发。
执行结果:
1.定时器(时间)事件触发
待办任务告诉我们,定时器事件触发了。
流程跟踪图也告诉我们定时器事件触发。
这时,完成定时器事件触发了的任务,该流程实例就全部结束。
2信号事件触发(需要重新启动流程,因为上一个流程已经结束)
我们通过一个单元测试模拟信号,让信号事件触发。
1 /**触发信号事件*/
2
3 @Test
4
5 public void completeSingal(){
6
7 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
8
9 List<Execution> executions = processEngine.getRuntimeService().createExecutionQuery()
10
11 .signalEventSubscriptionName("Singal")
12
13 .list();
14
15 for(Execution e:executions){
16
17 processEngine.getRuntimeService().signalEventReceived("Singal", e.getId());
18
19 }
20
21 }
通过控制台打印消息,告诉我们信号事件已经触发。
待办任务告诉我们信号事件触发了。
流程跟踪图告诉我们信号事件触发了。
3. 消息事件触发
单元测试模拟消息事件触发。
1 /**触发消息事件*/
2
3 @Test
4
5 public void completeMessage(){
6
7 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
8
9 List<Execution> executions = processEngine.getRuntimeService().createExecutionQuery()
10
11 .messageEventSubscriptionName("Message")
12
13 .list();
14
15 for(Execution e:executions){
16
17 processEngine.getRuntimeService().messageEventReceived("Message", e.getId());
18
19 }
20
21 }
控制台打印的消息告诉我们消息事件已经触发了。
待办任务告诉我们消息事件已经触发
流程跟踪图告诉我们消息事件已经触发
Activiti交流QQ群:634320089
来源:oschina
链接:https://my.oschina.net/u/4346199/blog/3285275