美文网首页
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