一、排他网关(Exclusive Gateway)
排他网关其实就是一个条件选择器,看你选择了什么条件,流程图的路线就会走到哪一个节点。
值得注意:
- 排他网关必须要设置流程图非默认线路的条件!!!
- 在设置排他网关的条件的时候,默认路线的条件不用在流程图上设置什么,但是在后台设置参数变量的时候也需要把参数设置为空字符串("")
variables1.put("operate", ""); // 设置用户的操作 为空 表示走flow3的默认路线
二、定时边界任务
定时边界任务表示在某个时间点执行它,或者是隔多长时间后出发,还可以设置循环规则。
Cancel activity:
- true时,当timer触发时,当前的activity被中断(流程结束);
- false时,当timer触发时,不会被中断(流程原点,流程不会结束);当执行循环定时器时,虽然Cancel activity=true,但是该acitivity还是会持续生成。
Time duration:延时多长时间后触发。例:P20D 表示20天以后触发
Time date:什么时间触发,采用ISO 8601的时间格式。例:2018-06-12T12:12:23 表示在2018年06 月12日 12:12:23触发
Time cycle:循环规则。规则:R【循环次数】【/开始时间】/时间间隔【/结束时间】。
variables2.put("startTime", "2018-6-11T14:22:00"); // 设置定时边界任务的触发时间 注意:后面的时间必须是ISO 8601时间格式的字符串!!!
排他网关和定时边界任务完整代码:
@RequestMapping("exclusiveGateway")
public void exclusiveGateway() {
//根据bpmn文件部署流程
repositoryService.createDeployment().addClasspathResource("exclusiveGateway.bpmn").deploy();
// 设置User Task1受理人变量
Map<String, Object> variables = new HashMap<>();
variables.put("user1", "007");
//采用key来启动流程定义并设置流程变量,返回流程实例
ProcessInstance pi = runtimeService.startProcessInstanceByKey("exclusiveGatewayAndTimerBoundaryEventProcess", variables);
String processId = pi.getId();
System.out.println("流程创建成功,当前流程实例ID:"+processId);
// 注意 这里需要拿007来查询,key-value需要拿value来获取任务
List<Task> list = taskService.createTaskQuery().taskAssignee("007").list();
Map<String, Object> variables1 = new HashMap<>();
variables1.put("user2", "lili"); // 设置User Task2的受理人变量
variables1.put("operate", ""); // 设置用户的操作 为空 表示走flow3的默认路线
taskService.complete(list.get(0).getId(), variables1);
System.out.println("User Task1被完成了,此时流程已流转到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"); // 设置定时边界任务的触发时间 注意:后面的时间必须是ISO 8601时间格式的字符串!!!
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("任务ID:"+task.getId());
System.out.println("任务的办理人:"+task.getAssignee());
System.out.println("任务名称:"+task.getName());
System.out.println("任务的创建时间:"+task.getCreateTime());
System.out.println("流程实例ID:"+task.getProcessInstanceId());
System.out.println("#######################################");
}
}
}
运行程序,浏览器访问: http://localhost:8080/activiti/exclusiveGateway
三、学习小结及注意事项
- 在使用排他网关时,需设置默认路线,并且默认路线不用设置条件;
- 定时边界任务使用时,若不需要中断流程,Cancel activity设置为false;使用ISO 8601的格式设置时间,请将启动时间设置到当前时间之后,否则数据库的ACT_RU_TIMER_JOB里面的任务永远不会被执行!
github地址:github源码