Activiti進階(九)——接收任務(ReceiveTask)
接收任務(ReceiveTask)即等待任務,接收任務是一個簡單任務,它會等待對應訊息的到達。當前,官方只實現
了這個任務的java語義。 當流程達到接收任務,流程狀態會儲存到資料庫中。在任務建立後,意味著流程會進入等
待狀態,直到引擎接收了一個特定的訊息, 這會觸發流程穿過接收任務繼續執行。
一、流程圖
圖一 等待任務流程圖
在這裡,我們使用每日向老闆彙總當日銷售額為例,來演示一下等待任務。
二、流程演示
package cn.gome.j_receiveTask; import java.io.InputStream; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.repository.Deployment; import org.activiti.engine.runtime.Execution; import org.activiti.engine.runtime.ProcessInstance; import org.junit.Test; public class ReceiveTaskTest { //流程引擎物件 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); /**部署流程定義+啟動流程例項*/ @Test public void deployementAndStartProcess(){ InputStream inputStreamBpmn = this.getClass().getResourceAsStream("receiveTask.bpmn"); InputStream inputStreamPng = this.getClass().getResourceAsStream("receiveTask.png"); //1.部署流程定義 Deployment deployment = processEngine.getRepositoryService() .createDeployment()//建立部署物件 .addInputStream("receiveTask.bpmn", inputStreamBpmn) .addInputStream("receiveTask.png", inputStreamPng) .deploy(); System.out.println("部署ID:" + deployment.getId()); //2.啟動流程例項 ProcessInstance pi = processEngine.getRuntimeService() .startProcessInstanceByKey("receiveTask");//使用流程定義的key的最新版本啟動流程 System.out.println("流程例項ID:"+pi.getId()); System.out.println("流程定義ID:"+pi.getProcessDefinitionId()); //3.查詢執行物件表,使用流程例項ID和當前活動的名稱(receivetask1) String processInstanceId = pi.getId();//得到流程例項ID Execution execution1 = processEngine.getRuntimeService() .createExecutionQuery() .processInstanceId(processInstanceId)//流程例項ID .activityId("receivetask1")//當前活動的名稱 .singleResult(); //4.使用流程變數設定當日的銷售額 processEngine.getRuntimeService().setVariable(execution1.getId(), "當日銷售額", 20000); //5.向後執行一步 processEngine.getRuntimeService() .signal(execution1.getId()); //6.查詢執行物件表,使用流程例項ID和當前活動的名稱(receivetask2) Execution execution2 = processEngine.getRuntimeService() .createExecutionQuery() .processInstanceId(processInstanceId) .activityId("receivetask2") .singleResult(); //7.獲取流程變數,給老闆傳送簡訊 Integer value = (Integer) processEngine.getRuntimeService() .getVariable(execution2.getId(), "當日銷售額"); System.out.println("給老闆傳送簡訊:內容,當日銷售額:"+value); //8.向後執行一步 processEngine.getRuntimeService() .signal(execution2.getId()); //9.判斷流程是否結束 ProcessInstance nowPi = processEngine.getRuntimeService() .createProcessInstanceQuery() .processInstanceId(pi.getId()) .singleResult(); if(nowPi == null){ System.out.println("流程結束"); } } }
說明:與使用者任務(UserTask)不同的是,接收任務(ReceiveTask)建立後,會進入一個等待狀態,一般指機器自動完成,但需要耗費一定時間的工作,當完成工作後後,向後推移流程,在上面的程式碼中也就是向下執行一步,使用runtimeService.signal(executionId),傳遞接收執行物件的id。
三、資料庫表分析
1.流程定義表:act_re_procdef
2.執行物件表:act_ru_execution:receiveTask1
3.流程變量表:act_ru_variable
4.執行物件表:act_ru_execution:receiveTask2
總結:
簡單介紹了一下等待任務,和我們之前使用者任務不太一樣的是,在等待任務執行的時候,act_ru_task表中是沒有資料的,只有任務節點(UserTask),該表中才有資料。
---------------------
作者:周江霄
來源:CSDN
原文:https://blog.csdn.net/zjx86320/article/details/50385444
版權宣告:本文為博主原創文章,轉載請附上博文連結!