本文是建立在流程定義,流程實例的基礎上的,可以參閱流程定義,流程實例。 本文主要給出瞭如何使用流程變量的demo,包含流程變量的設置、獲取方法,設置實例級別、任務級別的流程變量的方法,主要的描述請查看代碼以及代碼上的註釋。
import com.google.gson.Gson;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ActivitiApplication.class)
public class ProcessVariablesTest {
private Gson gson = new Gson();
@Autowired
private ProcessEngine processEngine;
/**
* 設置流程變量
* 1.流程變量的作用域就是流程實例,所以只要設置就行了,不用管在哪個階段設置
* 2.基本類型設置流程變量,在taskService中使用任務ID,定義流程變量的名稱,設置流程變量的值。
* 3.Javabean類型設置流程變量,需要這個javabean實現了Serializable接口
* 4.涉及到的表
* ACT_HI_VARINST 流程變量歷史表
* ACT_RU_VARIABLE 正在執行的流程變量表
* 5.RuntimeService對象可以設置流程變量和獲取流程變量
* 6.TaskService對象可以設置流程變量和獲取流程變量
* 7.流程實例啓動的時候可以設置流程變量
* 8.任務辦理完成的時候可以設置流程變量
* 9.流程變量可以通過名稱/值的形式設置單個流程變量
* 10.流程變量可以通過Map集合,同時設置多個流程變量
* 11.Map集合的key表示流程變量的名稱, Map集合的value表示流程變量的值
* 12.setVariable和setVariableLocal的區別
* setVariable:設置流程變量的時候,流程變量名稱相同的時候,後一次的值替換前一次的值,
* 而且可以看到TASK_ID的字段不會存放任務ID的值。
* setVariableLocal:
* 1:設置流程變量的時候,針對當前活動的節點設置流程變量,如果一個流程中存在2個活動節點,
* 對每個活動節點都設置流程變量,即使流程變量的名稱相同,後一次的版本的值也不會替換
* 前一次版本的值,它會使用不同的任務ID作爲標識,存放2個流程變量值,而且可以看到
* TASK_ID的字段會存放任務ID的值,例如act_hi_varinst 表的數據:不同的任務節點,即使流程變量名稱相同,
* 存放的值也是不同的。
* 2:使用setVariableLocal說明流程變量綁定了當前的任務,當流程繼續執行時,下個任務獲取
* 不到這個流程變量(因爲正在執行的流程變量中沒有這個數據),所有查詢正在執行的任務時
* 不能查詢到需要的數據,此時需要查詢歷史的流程變量。
*/
@Test
public void setVariablesTest() {
TaskService taskService = processEngine.getTaskService();
String instanceId = "17501";
Task task = taskService.createTaskQuery()
.processInstanceId(instanceId)
.singleResult();
taskService.setVariable(task.getId(), "姓名", "張三");
taskService.setVariable(task.getId(), "性別", "李四");
Map<String, Object> variables = new HashMap<>();
variables.put("key", "value");
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance pi = runtimeService.startProcessInstanceById("helloworld:5:32504", variables);
runtimeService.setVariable(pi.getProcessInstanceId(), "key1", "value1");
runtimeService.setVariables(pi.getProcessInstanceId(), variables);
List<String> keys = new ArrayList<>();
keys.add("key");
Map map = runtimeService.getVariables(pi.getProcessInstanceId());
System.out.println(gson.toJson(map));
}
/**
* 獲取流程變量
* 1.流程變量的獲取針對流程實例(即1個流程),每個流程實例獲取的流程變量時不同的
* 2.使用基本類型獲取流程變量,在taskService中使用任務ID,流程變量的名稱,獲取流程變量的值。
* 3.Javabean類型設置獲取流程變量,除了需要這個javabean實現了Serializable接口外,還要求流程變量對象的屬性不能發生變化,
* 否則拋出異常。解決方案,固定序列化ID
*/
@Test
public void getVariablesTest() {
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
.processInstanceId("17501")
.singleResult();
String name = (String) taskService.getVariable(task.getId(), "姓名");
String gender = (String) taskService.getVariable(task.getId(), "性別");
System.out.println("姓名:" + name + "\t 性別:" + gender);
}
/**
* 查詢歷史的流程變量
*/
@Test
public void getHisVariablesTest() {
List<HistoricVariableInstance> instances = processEngine.getHistoryService()
.createHistoricVariableInstanceQuery().variableName("姓名").list();
instances.forEach(instance -> {
System.out.println(instance.getVariableName() + "\t" + instance.getValue());
});
}
}