美文网首页
activiti6.0源码剖析之Transient Variab

activiti6.0源码剖析之Transient Variab

作者: 我有一只喵喵 | 来源:发表于2019-04-02 15:28 被阅读0次

    一、何为瞬时变量?

    瞬时变量是actiiti6.0新加的一个特性。瞬时变量的作用和使用其实和常规的变量是一样的,只是瞬时变量是不会被持久化的,这也就意味着瞬时变量是不会有历史审计的。这样做的好处就是我们可能对这些变量不需要过多的历史信息,当多个流程有非常多的变量时候,也可以减轻对数据库的压力。

    关于瞬时变量有以下几点:

    • 瞬时变量不会被持久化。act_ru_variable以及act_hi_varinst表中都不会有相关数据。

    • 瞬时变量仅能在下一个等待状态之前被获取,在此之后,瞬时变量也就是消失。等待状态其实就是流程实例完成一次持久化时的节点;比如当流程流转到用户任务,此时需要修改数据库执行实例当前运转的节点等,然后等待用户处理任务。注意:异步活动也算是一个等待状态

    • 瞬态变量在设置时放在最高父变量上。这意味着在执行实例中设置变量时,瞬态变量实际上存储在流程实例执行中

    • 瞬时变量的设置只能通过setTransientVariable(name, value)。然后当调用getVariable(name) 时瞬时变量也会被返回(当然也可以通过getTransientVariable(name)进行获取,该方法只返回瞬时变量 )

    • 针对上述第二条描述---瞬时变量的设置只能通过setTransientVariable(name, value)。这里要注意的是,瞬时变量对相同name的持久化变量会将其影藏,所以当同时拥有相同name的持久化变量和瞬时变量时,setTransientVariable(name, value)会返回瞬时变量。

    那么在哪些地方可以设置和获取瞬时变量呢?

    • 在JavaDelegate的实现中,可以通过DelegateExecution

    • 可以在ExecutionListener的实现中通过DelegateExecution,以及TaskListener的实现中通过DelegateTask

    • 在脚本任务中通过执行对象

    • 当通过runtimeService启动流程的时候

    ProcessInstance processInstance = runtimeService.createProcessInstanceBuilder()
           .processDefinitionKey("someKey")
           .transientVariable("configParam01", "A")
           .transientVariable("configParam02", "B")
           .transientVariable("configParam03", "C")
           .start();
    
    • 当调用runtimeService.trigger时

    二、瞬时变量实战

    验证:瞬时变量的生命周期持续到下一个等待状态(说白了就是生命周期可以维持在多个节点上),并且不会被持久化

    2.1 定义bpmn流程文件
    2.1.1 图形描述
    testTransient.png
    2.1.2 xml描述
      <process id="testTransient" isClosed="false" isExecutable="true" name="testTransient" processType="None">
        <startEvent id="startevent1" name="Start"/>
        <serviceTask activiti:class="char4.ServiceTask1" activiti:exclusive="true" id="servicetask1" name="Service Task1"/>
        <serviceTask activiti:class="char4.ServiceTask2" activiti:exclusive="true" id="servicetask2" name="Service Task2"/>
        <userTask activiti:assignee="${transientUser}" activiti:exclusive="true" id="usertask1" name="User Task"/>
        <sequenceFlow id="flow1" sourceRef="servicetask2" targetRef="usertask1"/>
        <serviceTask activiti:class="char4.ServiceTask3" activiti:exclusive="true" id="servicetask3" name="Service Task3"/>
        <endEvent id="endevent1" name="End"/>
        <sequenceFlow id="flow2" sourceRef="servicetask3" targetRef="endevent1"/>
        <sequenceFlow id="flow3" sourceRef="startevent1" targetRef="servicetask1"/>
        <sequenceFlow id="flow4" sourceRef="servicetask1" targetRef="servicetask2"/>
        <sequenceFlow id="flow5" sourceRef="usertask1" targetRef="servicetask3"/>
      </process>
    
    2.2 定义service task的任务
    • serviceTask1
    public class ServiceTask1 implements JavaDelegate {
       public void execute(DelegateExecution delegateExecution) {
           System.out.println(delegateExecution.getTransientVariable("startTransientVariable")+" on ServiceTask1");
    
       }
    }
    
    • serviceTask2
    public class ServiceTask2 implements JavaDelegate {
    
       public void execute(DelegateExecution delegateExecution) {
           System.out.println(delegateExecution.getTransientVariable("startTransientVariable")+" on ServiceTask2");
       }
    }
    
    • serviceTask3
    public class ServiceTask3 implements JavaDelegate {
       public void execute(DelegateExecution delegateExecution) {
           System.out.println(delegateExecution.getTransientVariable("startTransientVariable")+" on ServiceTask3");
    
       }
    }
    
    2.3 启动流程实例,并且设置瞬时变量

    这里在流程启动时设置了两个瞬时变量:
    一个瞬时变量用来验证瞬时变量在下一个等待状态后消失;
    另一个验证瞬时变量的使用和普通变量是一样的:这里是通过瞬时变量设置用户任务办理人。

        @Test
        public void startProcessBySetTransientVariables(){
            Map<String,Object> transientVariables = new HashMap<String, Object>();
            transientVariables.put("startTransientVariable","我是瞬时变量,在下一个等待状态我就获取不到了");
            transientVariables.put("transientUser","transientUser");
            String processKey = "testTransient";
            runtimeService.createProcessInstanceBuilder()
                    .processDefinitionKey(processKey)
                    .transientVariables(transientVariables)
                    .start();
        }
    

    此时看输出结果:

    我是瞬时变量,在下一个等待状态我就获取不到了 on ServiceTask1
    我是瞬时变量,在下一个等待状态我就获取不到了 on ServiceTask2
    

    看数据库中执行实例的状态,以及任务的数据

    act_ru_execution.png act_ru_task.png

    此时可以看到瞬时变量从开始节点维持到了useTask1节点,并且在userTask1节点中获取到了瞬时变量设置办理人值。

    那么?在这里用户任务相当于等待状态,所以在用户任务过后,瞬时变量就会消失。接下来通过完成用户任务使得流程运转到第三个serviceTask中来验证。

        @Test
        public void completeUserTask(){
            String taskId = "80008";
            taskService.complete(taskId);
        }
    

    输出结果:

    null on ServiceTask3
    

    相关文章

      网友评论

          本文标题:activiti6.0源码剖析之Transient Variab

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