一、排他網(wǎng)關(guān)(Exclusive Gateway)
排他網(wǎng)關(guān)其實(shí)就是一個(gè)條件選擇器瞒爬,看你選擇了什么條件牛柒,流程圖的路線就會走到哪一個(gè)節(jié)點(diǎn)务豺。
排他網(wǎng)關(guān)的設(shè)置
值得注意:
- 排他網(wǎng)關(guān)必須要設(shè)置流程圖非默認(rèn)線路的條件1目瘛J睦椤!
條件設(shè)置 - 在設(shè)置排他網(wǎng)關(guān)的條件的時(shí)候鸥咖,默認(rèn)路線的條件不用在流程圖上設(shè)置什么燕鸽,但是在后臺設(shè)置參數(shù)變量的時(shí)候也需要把參數(shù)設(shè)置為空字符串("")
variables1.put("operate", ""); // 設(shè)置用戶的操作 為空 表示走flow3的默認(rèn)路線
二兄世、定時(shí)邊界任務(wù)
定時(shí)邊界任務(wù)表示在某個(gè)時(shí)間點(diǎn)執(zhí)行它啼辣,或者是隔多長時(shí)間后出發(fā),還可以設(shè)置循環(huán)規(guī)則御滩。
定時(shí)邊界任務(wù)
Cancel activity:
- true時(shí)鸥拧,當(dāng)timer觸發(fā)時(shí),當(dāng)前的activity被中斷(流程結(jié)束);
- false時(shí)削解,當(dāng)timer觸發(fā)時(shí)富弦,不會被中斷(流程原點(diǎn),流程不會結(jié)束)氛驮;當(dāng)執(zhí)行循環(huán)定時(shí)器時(shí)腕柜,雖然Cancel activity=true,但是該acitivity還是會持續(xù)生成矫废。
Time duration:延時(shí)多長時(shí)間后觸發(fā)盏缤。例:P20D 表示20天以后觸發(fā)
Time date:什么時(shí)間觸發(fā),采用ISO 8601的時(shí)間格式蓖扑。例:2018-06-12T12:12:23 表示在2018年06 月12日 12:12:23觸發(fā)
Time cycle:循環(huán)規(guī)則唉铜。規(guī)則:R【循環(huán)次數(shù)】【/開始時(shí)間】/時(shí)間間隔【/結(jié)束時(shí)間】。
variables2.put("startTime", "2018-6-11T14:22:00"); // 設(shè)置定時(shí)邊界任務(wù)的觸發(fā)時(shí)間 注意:后面的時(shí)間必須是ISO 8601時(shí)間格式的字符串B筛堋L读鳌竞惋!
排他網(wǎng)關(guān)和定時(shí)邊界任務(wù)完整代碼:
@RequestMapping("exclusiveGateway")
public void exclusiveGateway() {
//根據(jù)bpmn文件部署流程
repositoryService.createDeployment().addClasspathResource("exclusiveGateway.bpmn").deploy();
// 設(shè)置User Task1受理人變量
Map<String, Object> variables = new HashMap<>();
variables.put("user1", "007");
//采用key來啟動流程定義并設(shè)置流程變量,返回流程實(shí)例
ProcessInstance pi = runtimeService.startProcessInstanceByKey("exclusiveGatewayAndTimerBoundaryEventProcess", variables);
String processId = pi.getId();
System.out.println("流程創(chuàng)建成功灰嫉,當(dāng)前流程實(shí)例ID:"+processId);
// 注意 這里需要拿007來查詢拆宛,key-value需要拿value來獲取任務(wù)
List<Task> list = taskService.createTaskQuery().taskAssignee("007").list();
Map<String, Object> variables1 = new HashMap<>();
variables1.put("user2", "lili"); // 設(shè)置User Task2的受理人變量
variables1.put("operate", ""); // 設(shè)置用戶的操作 為空 表示走flow3的默認(rèn)路線
taskService.complete(list.get(0).getId(), variables1);
System.out.println("User Task1被完成了,此時(shí)流程已流轉(zhuǎn)到User Task2");
List<Task> list1 = taskService.createTaskQuery().taskAssignee("lili").list();
Map<String, Object> variables2 = new HashMap<>();
variables2.put("user4", "bobo");
variables2.put("startTime", "2018-06-11T14:22:00"); // 設(shè)置定時(shí)邊界任務(wù)的觸發(fā)時(shí)間 注意:后面的時(shí)間必須是ISO 8601時(shí)間格式的字符串0靖ΑR忍簟!
taskService.complete(list1.get(0).getId(), variables2);
List<Task> list2 = taskService.createTaskQuery().taskAssignee("bobo").list();
if(list2!=null && list2.size()>0){
for(org.activiti.engine.task.Task task:list2){
System.out.println("任務(wù)ID:"+task.getId());
System.out.println("任務(wù)的辦理人:"+task.getAssignee());
System.out.println("任務(wù)名稱:"+task.getName());
System.out.println("任務(wù)的創(chuàng)建時(shí)間:"+task.getCreateTime());
System.out.println("流程實(shí)例ID:"+task.getProcessInstanceId());
System.out.println("#######################################");
}
}
}
運(yùn)行程序椿肩,瀏覽器訪問: http://localhost:8080/activiti/exclusiveGateway
運(yùn)行結(jié)果
三瞻颂、學(xué)習(xí)小結(jié)及注意事項(xiàng)
- 在使用排他網(wǎng)關(guān)時(shí),需設(shè)置默認(rèn)路線郑象,并且默認(rèn)路線不用設(shè)置條件贡这;
- 定時(shí)邊界任務(wù)使用時(shí),若不需要中斷流程厂榛,Cancel activity設(shè)置為false盖矫;使用ISO 8601的格式設(shè)置時(shí)間,請將啟動時(shí)間設(shè)置到當(dāng)前時(shí)間之后击奶,否則數(shù)據(jù)庫的ACT_RU_TIMER_JOB里面的任務(wù)永遠(yuǎn)不會被執(zhí)行辈双!
github地址:github源碼