Flowable中的各種網關,你知道多少個?
Flowable中的各種網關,你知道多少? 網絡管理 當流程到達一個基於事件的網關時,網關進入等待狀態:執行被暫停。同時,為每個流出的序列流創建一個相對的事件訂閱。 網關 網關用於控製進程的流動。 1. 獨占網關 排他性網關(也叫XOR網關,或更專業的、基於數據的排他性網關)被用來模擬進程中的決策。當執行到達這個網關時,所有的出口序列流都按照它們定義的順序進行評估。選擇第一個條件評估為真的序列流(當沒有設置條件時,序列流被認為是真的)來繼續進程。 註意,這裏的退出序列流的含義與BPMN 2.0中的一般情況不一樣。一般來說,所有條件評估為 "真 "的序列流將被選擇並並行執行。在排他性網關中,只有一個序列流被選中。當多個序列流的條件都被評估為真時,只有XML中首先定義的序列流將被選擇以繼續處理。如果沒有可選的序列流,將拋出一個異常。 一個排他性的網關由一個標準的網關(菱形)表示,裏面有一個'X'圖標,表示XOR。請註意,內部沒有圖標的網關默認為排他性網關。BPMN 2.0規範不允許在同一個流程中混合帶有和不帶有X的鉆石。 案例。 拷貝 /** * 部署流程 */ 測試 public void deploy(){ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine()。 RepositoryService repositoryService = processEngine.getRepositoryService()。 部署deploy = repositoryService.createDeployment() .addClasspathResource("請假流程-排他網關.bpmn20.xml") .name("請求流程-排他網關") .deploy()。 System.out.println("deploy.getId() = " + deploy.getId())。 System.out.println(deploy.getName())。 } /** * 啟動流程實例 */ 測試 public void runProcess(){ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RuntimeService runtimeService = processEngine.getRuntimeService()。 // 給流程定義中的uel表達式賦值 Map<String,Object> variables = new HashMap<>(); // variables.put("g1", "group1"); variables.put("num",3); // 給流程定義中的UEL表達式賦值 runtimeService.startProcessInstanceById("holiday-exclusive:1:4",variables)。 } /** * 啟動流程實例 */ @測試 public void setVariables(){ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RuntimeService runtimeService = processEngine.getRuntimeService()。 // 給流程定義中的uel表達式賦值 Map<String,Object> variables = new HashMap<>(); // variables.put("g1", "group1"); variables.put("num",4); // 給流程定義中的UEL表達式賦值 runtimeService.setVariables("12503",variables)。 } /** * 完成任務 */ 測試 public void completeTask(){ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); TaskService taskService = processEngine.getTaskService(); 任務task = taskService.createTaskQuery() //.processInstanceId("2501") .processDefinitionId("holiday-exclusive:1:4") .taskAssignee("zhangsan") .singleResult()。 如果(task != null){ // 完成任務 taskService.complete(task.getId())。 System.out.println("完成任務")。 } } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 二十一 二十二 二十三 二十四 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 如果從網關出去的線路的所有條件都不滿足,將拋出一個系統異常。 但要註意的是,任務沒有被引入,還是原來的任務,我們可以重置進程變量。 復製 @測試 public void setVariables(){ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine()。 RuntimeService runtimeService = processEngine.getRuntimeService()。 // 給流程定義中的uel表達式賦值 Map<String,Object> variables = new HashMap<>(); // variables.put("g1", "group1"); variables.put("num",4); // 給流程定義中的UEL表達式賦值 runtimeService.setVariables("12503",variables)。 } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 我們可以直接在連接線上定義條件,那麼為什麼要有一個排他性的網關?在直接連接的情況下,如果條件沒有得到滿足,過程就會結束,這是一個不正常的結束!所以,我們需要一個排他性的網關。