activiti6.0源码剖析之Transient Variab

2019-04-02  本文已影响0人  我有一只喵喵

一、何为瞬时变量?

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

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

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

ProcessInstance processInstance = runtimeService.createProcessInstanceBuilder()
       .processDefinitionKey("someKey")
       .transientVariable("configParam01", "A")
       .transientVariable("configParam02", "B")
       .transientVariable("configParam03", "C")
       .start();

二、瞬时变量实战

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

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的任务
public class ServiceTask1 implements JavaDelegate {
   public void execute(DelegateExecution delegateExecution) {
       System.out.println(delegateExecution.getTransientVariable("startTransientVariable")+" on ServiceTask1");

   }
}
public class ServiceTask2 implements JavaDelegate {

   public void execute(DelegateExecution delegateExecution) {
       System.out.println(delegateExecution.getTransientVariable("startTransientVariable")+" on ServiceTask2");
   }
}
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
上一篇 下一篇

猜你喜欢

热点阅读