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 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值