基於事件的網關 Event­based Gateway


基於事件的網關 Event­based 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM