接收任務(ReceiveTask)即等待任務,接收任務是一個簡單任務,它會等待對應消息的到達。當前,官方只實現了這個任務的java語義。 當流程達到接收任務,流程狀態會保存到數據庫中。在任務建立後,意味着流程會進入等待狀態,直到引擎接收了一個特定的消息, 這會觸發流程穿過接收任務繼續執行。java
1、流程圖數據庫
圖一 等待任務流程圖app
在這裏,咱們使用每日向老闆彙總當日銷售額爲例,來演示一下等待任務。this
2、流程演示spa
[java] view plain copy.net
- 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。對象
3、數據庫表分析blog
1.流程定義表:act_re_procdefip
2.執行對象表:act_ru_execution:receiveTask1部署
3.流程變量表:act_ru_variable
4.執行對象表:act_ru_execution:receiveTask2
總結:
簡單介紹了一下等待任務,和咱們以前用戶任務不太同樣的是,在等待任務執行的時候,act_ru_task表中是沒有數據的,只有任務節點(UserTask),該表中才有數據。