天天看点

【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)

上一次我们在配置好Activiti的开发环境之后,进行了以下开发:

1.绘制流程图

2.编写流程引擎加载类

3.通过流程引擎获取RepositoryService,加载bpmn文件进行部署。

我们在上篇中看到,当我们成功部署我们的流程对象之后,数据库中保存了

我们的一些流程信息:

【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)
【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)
【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)

我们部署了流程,为的就是使用这个流程方式去处理我们的业务,就如同

之前例子中的请假流程一样,当用户填写了请假申请之后,点击“申请请假”,

就启动了之前加载bpmn和png文件所部署的流程对象:

【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)
【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)

回顾之前我们编写的流程类:

package cn.com.helloworld;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.junit.Test;


public class HelloWorld {
	
	//获取流程引擎对象
	//getDefaultProcessEngine方法内部会自动读取名为activiti.cfg.xml文件的配置信息
	ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
	
	/**部署流程定义*/
	@Test
	public void deploymentProcessDefinition(){
		//与流程定义和部署对象相关的Service
		RepositoryService repositoryService=processEngine.getRepositoryService();
		
		DeploymentBuilder deploymentBuilder=repositoryService.createDeployment();//创建一个部署对象
		deploymentBuilder.name("helloWorld入门程序");//添加部署的名称
		deploymentBuilder.addClasspathResource("diagrams/MyProcess.bpmn");//从classpath的资源加载,一次只能加载一个文件
		deploymentBuilder.addClasspathResource("diagrams/MyProcess.png");//从classpath的资源加载,一次只能加载一个文件
		
		Deployment deployment=deploymentBuilder.deploy();//完成部署
		
		//打印我们的流程信息
		System.out.println("流程Id:"+deployment.getId());
		System.out.println("流程Name:"+deployment.getName());
	}
}
           

我们通过getDefaultProcessEngine自加载activiti.cfg.xml文件,获得流程引擎

的配置对象,然后通过配置对象获取流程引擎对象ProcessEngine,然后通过流程

引擎对象获取部署相关的Service对象,进而加载我们刚刚编写的流程图文件,进行

了流程实例的部署。

接下来我们就要将我们部署的流程实例进行启动:

/**启动流程引擎*/
@Test
public void startProcessInstance(){
	//获取流程启动Service
	RuntimeService runtimeService=processEngine.getRuntimeService();
	//使用流程定义的key,key对应bpmn文件对应的id,
	//(也是act_re_procdef表中对应的KEY_字段),默认是按照最新版本启动
	String processDefinitionkey="HelloWorld";//流程定义的key就是HelloWorld
	//获取流程实例对象
	ProcessInstance processInstance=runtimeService.startProcessInstanceByKey(processDefinitionkey);
	System.out.println("流程实例ID:"+processInstance.getId());//流程实例ID
	System.out.println("流程定义ID:"+processInstance.getProcessDefinitionId());//流程定义ID
}
           

运行之后结果:

【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)

我们可以看到流程定义ID为HelloWorld:1:4,与数据库act_re_procdef表中的ID字段吻合:

【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)

然后我们的实例ID实际上就是我们在代码中运行的实例所创建的ID,此ID会在

数据库中自动生成(默认从101开始),由Ru组表来存储实例信息:

【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)
【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)
【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)

可以看到,启动流程就相当于提交了申请,我们的申请人就是张三同学。

流程一旦启动了,我们的流程相当于提交成功了,根据我们的流程图:

【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)

那么第一个看到流程任务的就是我们的“张三”同学。所以张三同学就会

拥有一个新的“个人任务”,所以我们接下来就要“查询当前的个人任务”:

/**查询当前的个人任务(实际就是查询act_ru_task表)*/
@Test
public void findMyPersonalTask(){
	String assignee="张三";
	//获取事务Service
	TaskService taskService=processEngine.getTaskService();
	List<Task> taskList=taskService.createTaskQuery()//创建任务查询对象
			   .taskAssignee(assignee)//指定个人任务查询,指定办理人
			   .list();//获取该办理人下的事务列表
	
	if(taskList!=null&&taskList.size()>0){
		for(Task task:taskList){
			System.out.println("任务ID:"+task.getId());
			System.out.println("任务名称:"+task.getName());
			System.out.println("任务的创建时间:"+task.getCreateTime());
			System.out.println("任务办理人:"+task.getAssignee());
			System.out.println("流程实例ID:"+task.getProcessInstanceId());
			System.out.println("执行对象ID:"+task.getExecutionId());
			System.out.println("流程定义ID:"+task.getProcessDefinitionId());
			System.out.println("#############################################");
		}
	}
}
           

运行结果:

【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)

其实这一步和我们之前例子程序里面的点击“任务管理”触发的查询是一样的:

【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)

理所当然我们下一步就是点击“办理任务”,将这个任务办理,对于张三来说,就是将

自己的请假申请给提交到上级审批:

【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)

我们在测试类中实现办理任务的核心代码:

/**完成我的任务*/
@Test
public void completeMyPersonalTask(){
	String taskId="304";//上一次我们查询的任务ID就是304
	TaskService taskService=processEngine.getTaskService();
	taskService.complete(taskId);//完成taskId对应的任务
	System.out.println("完成ID为"+taskId+"的任务");
	
}
           

运行结果:

【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)

注意,完成任务之后,该流程的办理人员就不能再查到任务的相关信息了:

【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)

此时我们的张三的任务已经完成,流程就会走到下一级,也就是李四的任务列表中了:

【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)
【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)
【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)

同理,当李四审批完毕之后,任务完成,流程就会走到王五那里:

【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)
【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)
【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)

王五审批完毕后,走到结束节点,整个流程结束。我们查看act_hi_procinst表可以看到

流程具体结束时间:

【Activiti工作流】6.Activiti入门程序HelloWorld演示流程的执行(下)

以上就是我们Activiti的入门工程Helloworld的讲解。

转载请注明出处:http://blog.csdn.net/acmman/article/details/60466278