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