Activiti工作流之网关

风格不统一 提交于 2019-11-29 14:07:05

1.排他网关

排他网关(也叫异或(XOR)网关,或叫基于数据的排他网关),用来在流程中实现决策。 当流程执行到这个网关,所有分支都会判断条件是否为 true,如果为 true 则执行该分支。

注意,排他网关只会选择一个为 true 的分支执行。(即使有两个分支条件都为 true,排他网关也会只选择一条分支去执行)

 

如果从网关出去的线所有条件都不满足则系统抛出异常

 

说明:

  • 经过排他网关必须要有一条且只有一条分支走

  • 当排他网关中有多个条件同时满足,则走id最小的那个条件

2.并行网关

并行网关允许将流程分成多条分支,也可以把多条分支汇聚到一起,并行网关的功能是基于进入和外出顺序流的:

  • fork分支:

并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。

  • join汇聚:

所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后,流程就会通过汇聚网关。

注意,如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时, 网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。

与其他网关的主要区别是,并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略。

 

财务会计和行政考勤是两个并行分支

在 act_ru_execution 表有两条记录分别是财务结算和入库,act_ru_execution 还有一条记录表示该流程实例。

待财务结算和入库任务全部完成,在汇聚点汇聚,通过 parallelGateway 并行网关。并行网关在业务应用中常用于会签任务,会签任务即多个参与者共同办理的任务。

3.包含网关

包含网关可以看做是排他网关和并行网关的结合体。 和排他网关一样,你可以在外出顺序流上定义条件,包含网关会解析它们。 但是主要的区别是包含网关可以选择多于一条顺序流,这和并行网关一样。包含网关的功能是基于进入和外出顺序流的:

  • 分支:

所有外出顺序流的条件都会被解析,结果为 true 的顺序流会以并行方式继续执行, 会为每个顺序流创建一个分支。

  • 汇聚:

所有并行分支到达包含网关,会进入等待状态, 直到每个包含流程 token 的进入顺序流的分支都到达。 这是与并行网关的最大不同。换句话说,包含网关只会等待被选中执行了的进入顺序流。 在汇聚之后,流程会穿过包含网关继续执行。

(1)流程定义

企业体检流程,公司全体员工进行常规项检查、抽血化验,公司管理层除常规检查和抽血化验还要 进行增加项检查。

员工类型:

通过流程变量 userType 来表示,如果等于 1 表示普通员工,如果等于 2 表示领导

 

(2)部署流程

    public static void main(String[] args) {
        //1.创建ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​
        //2.得到RepositoryService实例
        RepositoryService repositoryService = processEngine.getRepositoryService();
​
        //3.进行部署
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("diagram/examine.bpmn")  //添加bpmn资源
                .name("体检流程")
                .deploy();
​
        //4.输出部署的一些信息
        System.out.println(deployment.getName());
        System.out.println(deployment.getId());
    }

(3)启动流程实例

    public static void main(String[] args) {
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​
        //2.得到RunService对象
        RuntimeService runtimeService = processEngine.getRuntimeService();
​
        Integer userType = 2;//代表管理者
        Map<String, Object> map = new HashMap<>();
        map.put("userType", userType);//流程变量赋值
​
        //3.创建流程实例  流程定义的key需要知道 holiday
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("examine", map);
​
​
        //4.输出实例的相关信息
        System.out.println("流程定义ID" + processInstance.getProcessDefinitionId());//holiday:1:4
        System.out.println("流程实例ID" + processInstance.getId());//2501
    }

(4)依次执行

    public static void main(String[] args) {
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​
        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();
​
        //3.查询当前用户的任务
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("examine")
                .taskAssignee("xiaoqi")
                .singleResult();
​
        //4.处理任务,结合当前用户任务列表的查询操作的话,任务ID:task.getId()
        if (task != null) {
            taskService.complete(task.getId());
            System.out.println("用户任务执行完毕...");
            //5.输出任务的id
            System.out.println(task.getId());
        }
    }

注意:在分支时,需要判断条件,符合条件的分支,将会执行,符合条件的分支最终才进行汇聚。

当执行到包含网关:

SELECT * FROM act_ru_task

 

上图中,常规项体检,抽血化验,附加项体检都是当前的任务,在并行执行。

等三个分支全部执行完毕后,分支和汇聚就从 act_ru_execution 删除。

流程执行完毕,可以查询一下之前的执行记录。

SELECT * FROM act_hi_actinct

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!