Activiti进阶(一)——HelloWorld

任何知识的学习都是有简入繁,我们的Activiti也不例外,这篇博文将通过一个简单的HelloWorld来带大家认识一下我们的Activiti;

    一、画流程图

 

    在画流程图之前,要确保自己的Eclipse安装了Activiti的插件。

                                          

                                                 图一  请假流程图

     

    在这里要说明一下,我们指定在画流程图的时候,要指明这个流程实例的ID、Name,然后设置好每个用户任务的ID、Name、Assignee(办理人);

     

    二、部署流程定义

 

    在这里我们使用Junit做模拟,代码如下:

  1. public class MyHelloWorld {  
  2.       
  3.     /**获得流程引擎*/  
  4.     ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  
  5.       
  6.     /**部署流程定义*/  
  7.     @Test  
  8.     public void deployProcessDefinition(){  
  9.           
  10.         Deployment deployment = processEngine.getRepositoryService()//获取流程定义和部署相关的Service  
  11.                 .createDeployment()//创建部署对象  
  12.                 .addClasspathResource("diagrams/myHelloWorld.bpmn")  
  13.                 .addClasspathResource("diagrams/myHelloWorld.png")  
  14.                 .deploy();//完成部署  
  15.           
  16.         System.out.println("部署ID:" + deployment.getId());//部署ID:1  
  17.         System.out.println("部署时间:" + deployment.getDeploymentTime());//部署时间  
  18.     }  
  19. }  
public class MyHelloWorld {
	
	/**获得流程引擎*/
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	
	/**部署流程定义*/
	@Test
	public void deployProcessDefinition(){
		
		Deployment deployment = processEngine.getRepositoryService()//获取流程定义和部署相关的Service
				.createDeployment()//创建部署对象
				.addClasspathResource("diagrams/myHelloWorld.bpmn")
				.addClasspathResource("diagrams/myHelloWorld.png")
				.deploy();//完成部署
		
		System.out.println("部署ID:" + deployment.getId());//部署ID:1
		System.out.println("部署时间:" + deployment.getDeploymentTime());//部署时间
	}
}

    

    在这里,我们使用RepositoryService来部署流程定义,使用addClasspathResource来从类路径下加载资源,需要注意的是,如果加上"/"表示从当前目录下寻找资源文件,如果不加"/",表示从类路径下加载资源文件;并且一次只能加载一个资源。

 

    执行结果如下:

    

 

    三、启动流程实例

 

    部署和启动对我们开发人员来说一定很熟悉,就拿我们平时做项目来讲,部署就是把项目扔到服务器中,启动就是将服务器运行起来;我们的Activiti也不例外,在这里我们使用RuntimeService来启动流程实例。

    启动流程的方式有很多,推荐使用流程定义的Key来启动,这样做的优势3是可以按照最新版本的流程启动流程实例。

 

 

  1. /**启动流程实例*/  
  2. @Test  
  3. public void startProcessInstance(){  
  4.       
  5.     String processDefinitionKey = "myMyHelloWorld";//流程定义的key,也就是bpmn中存在的ID  
  6.       
  7.     ProcessInstance pi = processEngine.getRuntimeService()//管理流程实例和执行对象,也就是表示正在执行的操作  
  8.             .startProcessInstanceByKey(processDefinitionKey);////按照流程定义的key启动流程实例  
  9.               
  10.     System.out.println("流程实例ID:" + pi.getId());//流程实例ID:101  
  11.     System.out.println("流程实例ID:" + pi.getProcessInstanceId());//流程实例ID:101  
  12.     System.out.println("流程实例ID:" + pi.getProcessDefinitionId());//myMyHelloWorld:1:4  
  13. }  
	/**启动流程实例*/
	@Test
	public void startProcessInstance(){
		
		String processDefinitionKey = "myMyHelloWorld";//流程定义的key,也就是bpmn中存在的ID
		
		ProcessInstance pi = processEngine.getRuntimeService()//管理流程实例和执行对象,也就是表示正在执行的操作
				.startProcessInstanceByKey(processDefinitionKey);////按照流程定义的key启动流程实例
				
		System.out.println("流程实例ID:" + pi.getId());//流程实例ID:101
		System.out.println("流程实例ID:" + pi.getProcessInstanceId());//流程实例ID:101
		System.out.println("流程实例ID:" + pi.getProcessDefinitionId());//myMyHelloWorld:1:4
	}

 

     执行结果如下:

    

 

    四、查看个人任务

 

    按照我们流程图上所画的,当这个流程启动之后,流程会停留在[提交申请]这个用户任务上,我们指定这个用户任务的办理人是张三,那么我们张三怎样查看他的任务呢?当然,我们先的知道办理人的名字,这个在我们画流程图的时候已经设置了,直接拿过来用就可以。我们用TaskService完成任务的查询。

 

 

  1. /**查看当前任务办理人的个人任务*/  
  2. @Test  
  3. public void findPersonnelTaskList(){  
  4.     String assignee = "张三";//当前任务办理人  
  5.     List<Task> tasks = processEngine.getTaskService()//与任务相关的Service  
  6.             .createTaskQuery()//创建一个任务查询对象  
  7.             .taskAssignee(assignee)  
  8.             .list();  
  9.     if(tasks !=null && tasks.size()>0){  
  10.         for(Task task:tasks){  
  11.             System.out.println("任务ID:"+task.getId());  
  12.             System.out.println("任务的办理人:"+task.getAssignee());  
  13.             System.out.println("任务名称:"+task.getName());  
  14.             System.out.println("任务的创建时间:"+task.getCreateTime());  
  15.             System.out.println("任务ID:"+task.getId());  
  16.             System.out.println("流程实例ID:"+task.getProcessInstanceId());  
  17.             System.out.println("#####################################");  
  18.         }  
  19.     }  
  20. }  
	/**查看当前任务办理人的个人任务*/
	@Test
	public void findPersonnelTaskList(){
		String assignee = "张三";//当前任务办理人
		List<Task> tasks = processEngine.getTaskService()//与任务相关的Service
				.createTaskQuery()//创建一个任务查询对象
				.taskAssignee(assignee)
				.list();
		if(tasks !=null && tasks.size()>0){
			for(Task task:tasks){
				System.out.println("任务ID:"+task.getId());
				System.out.println("任务的办理人:"+task.getAssignee());
				System.out.println("任务名称:"+task.getName());
				System.out.println("任务的创建时间:"+task.getCreateTime());
				System.out.println("任务ID:"+task.getId());
				System.out.println("流程实例ID:"+task.getProcessInstanceId());
				System.out.println("#####################################");
			}
		}
	}


        执行结果如下:

    

 

    五、完成个人任务

 

    既然要完成任务,当然少不了任务的ID了,我们在第四步已经得到了我们的任务ID,直接拿过来用就可以了。

 

 

  1. /**完成任务*/  
  2. @Test  
  3. public void completeTask(){  
  4.     String taskID = "704";  
  5.     processEngine.getTaskService().complete(taskID);  
  6.     System.out.println("完成任务:"+taskID);  
  7.       
  8. }  
	/**完成任务*/
	@Test
	public void completeTask(){
		String taskID = "704";
		processEngine.getTaskService().complete(taskID);
		System.out.println("完成任务:"+taskID);
		
	}


         执行结果如下:

    

 

    总结:

     至此,我们的HelloWorld就完成了,刚接触工作流的时候总觉得很复杂,过了一段时间之后就发现也就这么点东西,无非是把一个流程抽象出来一个一个对象而已。现在在敲一遍例子,真有种一气呵成的感觉。 

猜你喜欢

转载自yansxjl.iteye.com/blog/2337318