程序员从入门到放弃SpringHome

Activiti6.0整合SpringBoot2.0学习(三)

2018-06-13  本文已影响9人  KevinZc

一、排他网关(Exclusive Gateway)

排他网关其实就是一个条件选择器,看你选择了什么条件,流程图的路线就会走到哪一个节点。


排他网关的设置

值得注意:

  1. 排他网关必须要设置流程图非默认线路的条件!!!
    条件设置
  2. 在设置排他网关的条件的时候,默认路线的条件不用在流程图上设置什么,但是在后台设置参数变量的时候也需要把参数设置为空字符串("")
variables1.put("operate", ""); // 设置用户的操作 为空 表示走flow3的默认路线

二、定时边界任务

定时边界任务表示在某个时间点执行它,或者是隔多长时间后出发,还可以设置循环规则。


定时边界任务

Cancel activity:

  1. true时,当timer触发时,当前的activity被中断(流程结束);
  2. 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

运行结果

三、学习小结及注意事项

  1. 在使用排他网关时,需设置默认路线,并且默认路线不用设置条件;
  2. 定时边界任务使用时,若不需要中断流程,Cancel activity设置为false;使用ISO 8601的格式设置时间,请将启动时间设置到当前时间之后,否则数据库的ACT_RU_TIMER_JOB里面的任务永远不会被执行!

github地址:github源码

上一篇下一篇

猜你喜欢

热点阅读