Activiti流程实例开始结束,接收任务活动

代码:

StartTest.java

package com.ytdx.start;

import java.io.InputStream;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;

/**
 * 流程实例开始结束
 * @author lhy
 *
 */
public class StartTest {

	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	
	/**
	 * 部署流程定义(从inputStream)
	 */
	@Test
	public void deploymentProcess_inputStream(){
		InputStream inputStreamBpmn = this.getClass().getClassLoader().getResourceAsStream("start.bpmn");
		InputStream inputStreamPng = this.getClass().getClassLoader().getResourceAsStream("start.png");
		Deployment deployment = processEngine.getRepositoryService()                                                   //与流程定义和部署对象相关的Service
				.createDeployment()                                                                                    //创建一个部署对象
				.name("开始活动")                                                                                         //添加部署的名称
				.addInputStream("start.bpmn", inputStreamBpmn)
				.addInputStream("start.png", inputStreamPng)
				.deploy();                                                                                             //完成部署
		System.out.println("部署ID:"+deployment.getId());
		System.out.println("部署名称:"+deployment.getName());
	}
	
	/**
	 * 启动流程实例+判断流程是否结束+查询历史(act_re_procdef表)
	 */
	@Test
	public void startProcessInstance(){
		String processDefinitionKey = "start";                                                                          //流程定义的key
		ProcessInstance pi = processEngine.getRuntimeService()                                                          //与正在执行的流程实例和执行对象相关的Service
				.startProcessInstanceByKey(processDefinitionKey);                                                       //使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动
		System.out.println("流程实例ID:"+pi.getId());
		System.out.println("流程定义ID:"+pi.getProcessDefinitionId());
		
		/**判断流程是否结束,查询正在执行的执行对象表*/
		ProcessInstance rpi = processEngine.getRuntimeService()
				.createProcessInstanceQuery()                                           //创建流程实例查询对象
				.processInstanceId(pi.getId())
				.singleResult();
		
		if(rpi == null){  //如果流程实例结束了
			//说明流程实例结束了
			HistoricProcessInstance hpi = processEngine.getHistoryService()
					.createHistoricProcessInstanceQuery()
					.processInstanceId(pi.getId())                                     //使用流程实例ID查询
					.singleResult();
			System.out.println(hpi.getId()+"    "+hpi.getStartTime()+"   "+hpi.getEndTime()+"   "+hpi.getDurationInMillis());
		}
	}
}

ReceiveTaskTest.java

package com.ytdx.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.ProcessInstance;
import org.junit.Test;
import org.activiti.engine.runtime.Execution;
/**
 * 接受任务活动测试
 * @author lhy
 *
 */
public class ReceiveTaskTest {

	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	
	/**
	 * 部署流程定义(从inputStream)
	 */
	@Test
	public void deploymentProcess_inputStream(){
		InputStream inputStreamBpmn = this.getClass().getClassLoader().getResourceAsStream("receiveTask.bpmn");
		InputStream inputStreamPng = this.getClass().getClassLoader().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(){
		String processDefinitionKey = "receiveTask";                                                            //流程定义的key
		ProcessInstance pi = processEngine.getRuntimeService()                                                  //与正在执行的流程实例和执行对象相关的Service
				        .startProcessInstanceByKey(processDefinitionKey);
		System.out.println("流程实例ID:"+pi.getId());
		System.out.println("流程定义ID:"+pi.getProcessDefinitionId());
		
		/**查询执行对象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);
		
		/**向后执行一步,如果流程处于等待状态,使得流程继续执行*/
		processEngine.getRuntimeService()
		             .signal(execution2.getId());
	}
}

流程图:

流程实例开始结束总结:

1):结束节点没有出口

2):其他节点有一个或多个出口。

如果有一个出口,则代表是一个单线流程

如果有多个出口,则代表是开启并发流程

接受任务活动总结:

  接收任务是一个简单任务,它会等待对应消息的到达。 当前,官方只实现了这个任务的java语义。 当流程达到接收任务,流程状态会保存到数据库中。

     在任务创建后,意味着流程会进入等待状态 直到引擎接收了一个特定的消息 这会触发流程穿过接收任务继续执行。

1)当前任务(一般指机器自动完成,但需要耗费一定时间的工作)完成后,向后推移流程,可以调用runtimeService.signal(executionId),传递接收执行对象的id

猜你喜欢

转载自blog.csdn.net/linhaiyun_ytdx/article/details/81006094