一般此、何為瞬時變量跷车?
瞬時變量是actiiti6.0新加的一個特性。瞬時變量的作用和使用其實和常規(guī)的變量是一樣的拧粪,只是瞬時變量是不會被持久化的修陡,這也就意味著瞬時變量是不會有歷史審計的。這樣做的好處就是我們可能對這些變量不需要過多的歷史信息可霎,當多個流程有非常多的變量時候魄鸦,也可以減輕對數(shù)據(jù)庫的壓力。
關(guān)于瞬時變量有以下幾點:
瞬時變量不會被持久化啥纸。act_ru_variable以及act_hi_varinst表中都不會有相關(guān)數(shù)據(jù)号杏。
瞬時變量僅能在下一個等待狀態(tài)之前被獲取,在此之后斯棒,瞬時變量也就是消失盾致。等待狀態(tài)其實就是流程實例完成一次持久化時的節(jié)點;比如當流程流轉(zhuǎn)到用戶任務(wù)荣暮,此時需要修改數(shù)據(jù)庫執(zhí)行實例當前運轉(zhuǎn)的節(jié)點等庭惜,然后等待用戶處理任務(wù)。注意:異步活動也算是一個等待狀態(tài)穗酥。
瞬態(tài)變量在設(shè)置時放在最高父變量上护赊。這意味著在執(zhí)行實例中設(shè)置變量時,瞬態(tài)變量實際上存儲在流程實例執(zhí)行中
瞬時變量的設(shè)置只能通過setTransientVariable(name, value)砾跃。然后當調(diào)用getVariable(name) 時瞬時變量也會被返回(當然也可以通過getTransientVariable(name)進行獲取骏啰,該方法只返回瞬時變量 )
針對上述第二條描述---瞬時變量的設(shè)置只能通過setTransientVariable(name, value)。這里要注意的是抽高,瞬時變量對相同name的持久化變量會將其影藏判耕,所以當同時擁有相同name的持久化變量和瞬時變量時,setTransientVariable(name, value)會返回瞬時變量翘骂。
那么在哪些地方可以設(shè)置和獲取瞬時變量呢壁熄?
在JavaDelegate的實現(xiàn)中帚豪,可以通過DelegateExecution
可以在ExecutionListener的實現(xiàn)中通過DelegateExecution,以及TaskListener的實現(xiàn)中通過DelegateTask
在腳本任務(wù)中通過執(zhí)行對象
當通過runtimeService啟動流程的時候
ProcessInstance processInstance = runtimeService.createProcessInstanceBuilder()
.processDefinitionKey("someKey")
.transientVariable("configParam01", "A")
.transientVariable("configParam02", "B")
.transientVariable("configParam03", "C")
.start();
- 當調(diào)用runtimeService.trigger時
二草丧、瞬時變量實戰(zhàn)
驗證:瞬時變量的生命周期持續(xù)到下一個等待狀態(tài)(說白了就是生命周期可以維持在多個節(jié)點上)狸臣,并且不會被持久化
2.1 定義bpmn流程文件
2.1.1 圖形描述
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的任務(wù)
- 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 啟動流程實例,并且設(shè)置瞬時變量
這里在流程啟動時設(shè)置了兩個瞬時變量:
一個瞬時變量用來驗證瞬時變量在下一個等待狀態(tài)后消失;
另一個驗證瞬時變量的使用和普通變量是一樣的:這里是通過瞬時變量設(shè)置用戶任務(wù)辦理人昌执。
@Test
public void startProcessBySetTransientVariables(){
Map<String,Object> transientVariables = new HashMap<String, Object>();
transientVariables.put("startTransientVariable","我是瞬時變量烛亦,在下一個等待狀態(tài)我就獲取不到了");
transientVariables.put("transientUser","transientUser");
String processKey = "testTransient";
runtimeService.createProcessInstanceBuilder()
.processDefinitionKey(processKey)
.transientVariables(transientVariables)
.start();
}
此時看輸出結(jié)果:
我是瞬時變量,在下一個等待狀態(tài)我就獲取不到了 on ServiceTask1
我是瞬時變量仙蚜,在下一個等待狀態(tài)我就獲取不到了 on ServiceTask2
看數(shù)據(jù)庫中執(zhí)行實例的狀態(tài)此洲,以及任務(wù)的數(shù)據(jù)
此時可以看到瞬時變量從開始節(jié)點維持到了useTask1節(jié)點厂汗,并且在userTask1節(jié)點中獲取到了瞬時變量設(shè)置辦理人值委粉。
那么?在這里用戶任務(wù)相當于等待狀態(tài)娶桦,所以在用戶任務(wù)過后贾节,瞬時變量就會消失。接下來通過完成用戶任務(wù)使得流程運轉(zhuǎn)到第三個serviceTask中來驗證衷畦。
@Test
public void completeUserTask(){
String taskId = "80008";
taskService.complete(taskId);
}
輸出結(jié)果:
null on ServiceTask3