天天看點

Activiti 學習筆記11:接收活動(receiveTask,即等待活動)

接收任務是一個簡單任務,它會等待對應消息的到達。 目前,官方隻實作了這個任務的java語義。 當流程達到接收任務,流程狀态會儲存到資料庫中。

在任務建立後,意味着流程會進入等待狀态 , 直到引擎接收了一個特定的消息 , 這會觸發流程穿過接收任務繼續執行。

一、流程圖

Activiti 學習筆記11:接收活動(receiveTask,即等待活動)

二、示範代碼

package jiankunking.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();

    /**部署流程定義(從inputStream)*/
    @Test
    public void deploymentProcessDefinition_inputStream(){
        InputStream inputStreamBpmn = this.getClass().getResourceAsStream("receiveTask.bpmn");
        InputStream inputStreamPng = this.getClass().getResourceAsStream("receiveTask.png");
        Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對象相關的Service
                        .createDeployment()//建立一個部署對象
                        .name("接收活動任務")//添加部署的名稱
                        .addInputStream("receiveTask.bpmn", inputStreamBpmn)//
                        .addInputStream("receiveTask.png", inputStreamPng)//
                        .deploy();//完成部署
        System.out.println("部署ID:"+deployment.getId());//
        System.out.println("部署名稱:"+deployment.getName());//
    }

    /**啟動流程執行個體+設定流程變量+擷取流程變量+向後執行一步*/
    @Test
    public void startProcessInstance(){
        //流程定義的key
        String processDefinitionKey = "receiveTask";
        ProcessInstance pi = processEngine.getRuntimeService()//與正在執行的流程執行個體和執行對象相關的Service
                        .startProcessInstanceByKey(processDefinitionKey);//使用流程定義的key啟動流程執行個體,key對應helloworld.bpmn檔案中id的屬性值,使用key值啟動,預設是按照最新版本的流程定義啟動
        System.out.println("流程執行個體ID:"+pi.getId());//流程執行個體ID    101
        System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID   helloworld:1:4

        /**查詢執行對象ID*/
        Execution execution1 = processEngine.getRuntimeService()//
                        .createExecutionQuery()//建立執行對象查詢
                        .processInstanceId(pi.getId())//使用流程執行個體ID查詢
                        .activityId("receivetask1")//目前活動的id,對應receiveTask.bpmn檔案中的活動節點id的屬性值
                        .singleResult();

        /**使用流程變量設定當日銷售額,用來傳遞業務參數*/
        processEngine.getRuntimeService()//
                        .setVariable(execution1.getId(), "彙總當日銷售額", 21000);

        /**向後執行一步,如果流程處于等待狀态,使得流程繼續執行*/
        processEngine.getRuntimeService()
                        .signal(execution1.getId());

        /**查詢執行對象ID*/
        Execution execution2 = processEngine.getRuntimeService()//
                        .createExecutionQuery()//建立執行對象查詢
                        .processInstanceId(pi.getId())//使用流程執行個體ID查詢
                        .activityId("receivetask2")//目前活動的id,對應receiveTask.bpmn檔案中的活動節點id的屬性值
                        .singleResult();

        /**從流程變量中擷取彙總當日銷售額的值*/
        Integer value = (Integer)processEngine.getRuntimeService()//
                        .getVariable(execution2.getId(), "彙總當日銷售額");
        System.out.println("給老闆發送短信:金額是:"+value);
        /**向後執行一步,如果流程處于等待狀态,使得流程繼續執行*/      

三、小結

目前任務(一般指機器自動完成,但需要耗費一定時間的工作)完成後,向後推移流程,可以調用runtimeService.signal(executionId),傳遞接收執行對象的id。