美文网首页activiti工作流
activiti6.0源码剖析之多实例运转过程

activiti6.0源码剖析之多实例运转过程

作者: 我有一只喵喵 | 来源:发表于2019-04-22 15:12 被阅读7次

    如果想直接看结果则直接翻到最后看总结

    Start、多实例运转过程分析

    多实例运转过程中的要素(变量):

    • 在所有多执行实例的父级执行实例会有如下必要的变量

    1、nrOfInstances : 多实例总数

    2、nrOfActiveInstances :当前活动的实例数,即尚未完成的实例数。对于串行多实 例,这个值总是1。

    3、nrOfCompletedInstances :已完成实例的数量

    • 多实例中每个创建的执行实例都会有一个执行本地变量(即其他执行不可见,也不存储在流程实例级):
      loopCounter :指示该特定实例的for-each循环中的索引
    • 串行多实例运转过程

    串行流程.png
    一、流程启动
        @Test
        public void startProcessInstance(){
            String key ="multi";
            String[] users = {"user1","user2","user3"};
            HashMap<String,Object> variables = new HashMap<String, Object>();
            variables.put("userList", Arrays.asList(users));
            runtimeService.startProcessInstanceByKey(key,variables);
        }
    

    观察数据库各表的变化

    act_ru_execution.png

    act_ru_execution中生成了三条执行实例数据,第一条为最顶层执行实例也标志着整个流程实例,第二条则是流程运转过程中的执行实例,第三条为多实例下的执行实例,它的父级实例就是流程运转过程中的执行实例(第二条)。这样看,就像是一个三级树结构。

    act_ru_task.png

    act_ru_task中只有一条用户任务数据,并且处理人是我们定义的用户集合中第一个元素。

    act_ru_variable.png

    初始nrOfCompletedInstances为0,nrOfActiveInstances为1

    二、完成user1的task任务
        @Test
        public void completeUserTask(){
            String taskId = "2514";
            taskService.complete(taskId);
        }
    

    观察数据库各表的变化

    act_ru_execution.png

    ru_execution没有发送变化

    act_ru_task.png

    此时第一个用户任务已经完成被删除,紧接着为第二个用户任务

    act_ru_variable.png

    nrOfCompletedInstances变量+1,并且loopCounter也+1,这说明此时活动的实例为第loopCounter+1个多实例

    三、串行多实例运转过程

    通过上述实战我们可以知道在串行多实例运转的过程中会有以下几点:

    1、串行多实例中只会生成一个三级执行实例,并且一直到所有的串行实例结束,该三级执行实例结束,在这之前,该实例一直处于活动状态(即IS_ACTIVE = 1)

    2、在三级执行实例的父级实例的变量中,每当完成一个实例后nrOfCompletedInstances 1,nrOfActiveInstances一直保持为1

    3、loopCounter变量为此时流程中正在运转的多实例执行实例的索引,即多实例中第几个执行实例正在运转。


    • 并行多实例运转过程

    并行流程.png
    一、启动流程
        @Test
        public void startProcessInstance(){
            String key ="multi";
            String[] users = {"user1","user2","user3"};
            HashMap<String,Object> variables = new HashMap<String, Object>();
            variables.put("userList", Arrays.asList(users));
            runtimeService.startProcessInstanceByKey(key,variables);
        }
    

    观察数据库各表的变化

    act_ru_execution.png

    act_ru_execution表中除了标志整个流程实例的执行实例和流程运转的执行实例外,生成了三条三级执行实例,并且都为活动状态。

    act_ru_task.png

    act_ru_task中生成三条用户任务数据

    act_ru_variable.png

    初始nrOfCompletedInstances为0,nrOfActiveInstances为多实例个数

    二、完成user1的task任务
        @Test
        public void completeUserTask(){
            String taskId = "2520";
            taskService.complete(taskId);
        }
    

    观察数据库各表的变化

    act_ru_execution.png

    已经完成的用户任务的所属执行实例的IS_ACTIVE变为0,但是还未结束

    act_ru_task.png

    已经完成的用户任务被清除

    act_ru_variable.png

    变量nrOfCompletedInstances+1,nrOfActiveInstances-1

    三、并多实例运转过程

    通过上述实战我们可以知道在并行多实例运转的过程中会有以下几点:

    1、并行多实例中会生成多实例个数个三级执行实例,初始都处于活动状态(即IS_ACTIVE=1,每当一个执行实例完成后,IS_ACTIVE = 0,但是还没有结束,直到所有的多实例三级执行实例都完成后,才会结束从数据库中被清除

    2、在三级执行实例的父级实例的变量中,每当完成一个实例后nrOfCompletedInstances 1,nrOfActiveInstances 1

    END、多实例运转过程总结

    • 串行多实例运转过程

    1、串行多实例中只会生成一个三级执行实例,并且一直到所有的串行实例结束,该三级执行实例结束,在这之前,该实例一直处于活动状态(即IS_ACTIVE = 1)

    2、在三级执行实例的父级实例的变量中,每当完成一个实例后nrOfCompletedInstances 1,nrOfActiveInstances一直保持为1

    3、loopCounter变量为此时流程中正在运转的多实例执行实例的索引,即多实例中第几个执行实例正在运转。


    • 并行多实例运转过程

    1、并行多实例中会生成多实例个数个三级执行实例,初始都处于活动状态(即IS_ACTIVE=1,每当一个执行实例完成后,IS_ACTIVE = 0,但是还没有结束,直到所有的多实例三级执行实例都完成后,才会结束从数据库中被清除

    2、在三级执行实例的父级实例的变量中,每当完成一个实例后nrOfCompletedInstances 1,nrOfActiveInstances 1

    相关文章

      网友评论

        本文标题:activiti6.0源码剖析之多实例运转过程

        本文链接:https://www.haomeiwen.com/subject/hvpegqtx.html