一、何为瞬时变量?
瞬时变量是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.png2.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
看数据库中执行实例的状态,以及任务的数据
此时可以看到瞬时变量从开始节点维持到了useTask1节点,并且在userTask1节点中获取到了瞬时变量设置办理人值。
那么?在这里用户任务相当于等待状态,所以在用户任务过后,瞬时变量就会消失。接下来通过完成用户任务使得流程运转到第三个serviceTask中来验证。
@Test
public void completeUserTask(){
String taskId = "80008";
taskService.complete(taskId);
}
输出结果:
null on ServiceTask3
网友评论