【Activiti】從入門到放棄——流程變數
概念
流程變數在整個工作流中扮演很重要的作用。例如:請假流程中有請假天數、請假原因等一些引數都為流程變數的範圍。流程變數的作用域範圍是流程例項。也就是說各個流程例項的流程變數是不相互影響的。流程例項結束完成以後流程變數還儲存在資料庫中(存放到流程變數的歷史表中)。
新增和獲取流程變數
1:流程變數是什麼:流程變數在整個工作流中扮演很重要的作用
2:有什麼用:在流程中傳遞資訊(共享資訊)
3:設計思想(儘量瞭解)
4:操作:設定\獲取
步驟:1繪製流程定義圖2部署流程3啟動流程4測試
1.流程圖
部署流程定義
@Test public void deployTest() { //獲取核心物件 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取服務 RepositoryService repositoryService = processEngine.getRepositoryService(); //操作 DeploymentBuilder deploymentBuilder = repositoryService.createDeployment(); deploymentBuilder .name("請假流程")//設定部署名稱 .addClasspathResource("ProcessVarTest.bpmn") .addClasspathResource("ProcessVarTest.png"); deploymentBuilder.deploy(); }
啟動流程例項
@Test public void startProcessTest() throws Exception { //建立核心物件 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取服務 RuntimeService runtimeService = processEngine.getRuntimeService(); String processDefinitionKey="ProcessVarTestId"; Map<String,Object> variables=new HashMap<>(); variables.put("剩餘年假天數", 3); variables.put("剩餘病假天數", 10); //操作:啟動的時候設定流程變數 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, variables); System.out.println("pId="+processInstance.getId());//2501 }
設定流程變數
@Test public void setVarTest() throws Exception { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); TaskService taskService = processEngine.getTaskService(); String processInstanceId="2501"; String assignee="小莉"; //通過任務服務獲取這個流程例項中 小莉的唯一的一個任務 Task task = taskService.createTaskQuery() .processInstanceId(processInstanceId)//在一次流程例項中一個人的任務是唯一的 .taskAssignee(assignee) .singleResult(); System.out.println(task); //設定一個流程變數 String taskId = task.getId(); taskService.setVariable(taskId, "請假人", assignee); Map<String,Object> variables=new HashMap<>(); variables.put("請假原因","想男朋友了");//設定String variables.put("請假天數", 3);//設定Integer variables.put("是否扣工資",true);//設定boolean:存long型:1true;0false variables.put("請假開始時間", new Date());//設定Date型別 variables.put("扣多少錢", 666.666d);//設定Double //設定多個流程變數: taskService.setVariables(taskId, variables); //完成任務的時候設定: Map<String,Object> variables1=new HashMap<>(); variables1.put("叫老闆", "親愛的老闆,我真的要回去找男朋友,很急的。。。。。"); taskService.complete(taskId, variables1); }
說明:
1)流程變數的作用域就是流程例項,所以只要設定就行了,不用管在哪個階段設定
2)基本型別設定流程變數,在taskService中使用任務ID,定義流程變數的名稱,設定流程變數的值。
3)Javabean型別設定流程變數,需要這個javabean實現了Serializable介面
4)設定流程變數的時候,向act_ru_variable這個表新增資料
獲取流程變數
/**
* 獲取流程變數的方式:
* @throws Exception
*/
@Test
public void getVarTest() throws Exception {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
String processInstanceId="2501";
String assignee="美麗";
//一個流程例項中,一個辦理人只有一個任務
Task task = taskService.createTaskQuery().
processInstanceId(processInstanceId).
taskAssignee(assignee)
.singleResult();
String taskId=task.getId();
Map<String, Object> variables = taskService.getVariables(taskId);
System.out.println("所有的流程變數:"+variables);
Map<String, Object> variables2 = taskService.getVariables(taskId, Arrays.asList("請假天數","叫老闆"));
System.out.println("批量獲取流程變數:"+variables2);
Double money = (Double) taskService.getVariable(taskId, "扣多少錢");
System.out.println("獲取一個變數:"+money);
Date beginDate = taskService.getVariable(taskId, "請假開始時間",Date.class);
System.out.println("獲取一個變數:"+beginDate);
}
說明:
1)流程變數的獲取針對流程例項(即1個流程),每個流程例項獲取的流程變數時不同的
2)使用基本型別獲取流程變數,在taskService中使用任務ID,流程變數的名稱,獲取流程變數的值。
3)Javabean型別設定獲取流程變數,除了需要這個javabean實現了Serializable介面外,還要求流程變數物件的屬性不能發生變化,否則丟擲異常。解決方案,固定序列化ID
模擬流程變數的設定和獲取的場景
/**
* 模擬檢視設定變數和獲取變數的api,目的是整理屬性api
* //設定流程變數:4種
//①:啟動流程的時候設定
//②:任務完成的時候設定
//③:runtimeService設定
//④:taskService設定
//獲取流程變數:2種
//①:runtimeService獲取變數
//②:taskService獲取變數
* @throws Exception
*/
@Test
public void setVarAndGetVarTest() throws Exception {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
TaskService taskService = processEngine.getTaskService();
//設定流程變數:4種
//①:啟動流程的時候設定
//runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);
//②:任務完成的時候設定
//taskService.complete(taskId, variables);
//③:runtimeService設定
//runtimeService.setVariable(executionId, variableName, value);//存一個
//runtimeService.setVariables(executionId, variables);//存多個
//④:taskService設定
//taskService.setVariable(taskId, variableName, value);//存一個
//taskService.setVariables(taskId, variables);//存多個
//獲取流程變數:2種
//①:runtimeService獲取變數
//runtimeService.getVariables(executionId)//獲取所有
//runtimeService.getVariables(executionId, variableNames)//批量獲取
//runtimeService.getVariable(executionId, variableName);//獲取一個,但是要強轉
//runtimeService.getVariable(executionId, variableName, variableClass)//獲取一個,帶泛型,不強轉
//②:taskService獲取變數
//taskService.getVariables(taskId)//獲取所有
//taskService.getVariables(taskId, variableNames)//批量獲取
//taskService.getVariable(taskId, variableName);//獲取一個,但是要強轉
//taskService.getVariable(taskId, variableName, variableClass)//獲取一個,帶泛型,不強轉
}
說明:
1)RuntimeService物件可以設定流程變數和獲取流程變數
2)TaskService物件可以設定流程變數和獲取流程變數
3)流程例項啟動的時候可以設定流程變數
4)任務辦理完成的時候可以設定流程變數
5)流程變數可以通過名稱/值的形式設定單個流程變數
6)流程變數可以通過Map集合,同時設定多個流程變數
Map集合的key表示流程變數的名稱
Map集合的value表示流程變數的值