1. 程式人生 > >Activiti進階(九)——接收任務(ReceiveTask)

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 
版權宣告:本文為博主原創文章,轉載請附上博文連結!