Activiti进阶(4)——流程变量的设置和获取

Activiti进阶(四)——流程变量的设置和获取

流程变量在整个工作流中扮演很重要的作用。例如:请假流程中有请假天数、请假原因等一些参数都为流程变量的范围。流程变量的作用域范围是只对应一个流程实例。也就是说各个流程实例的流程变量是不相互影响的。这篇博文就简单的为大家介绍下流程变量的设置和获取。

 

     一、设置流程变量

 

     流程变量的设置方式有两种,一是通过基本类型设置,第二种是通过JavaBean类型设置。

 

     1.基本类型

 

 

[java] view plain copy print?
  1. /**设置流程变量*/  
  2. @Test  
  3. public void setProcessVariables(){  
  4.     String processInstanceId = "1301";//流程实例ID  
  5.     String assignee = "张三";//任务办理人  
  6.     TaskService taskService = processEngine.getTaskService();//获取任务的Service,设置和获取流程变量  
  7.       
  8.     //查询当前办理人的任务ID  
  9.     Task task = taskService.createTaskQuery()  
  10.             .processInstanceId(processInstanceId)//使用流程实例ID  
  11.             .taskAssignee(assignee)//任务办理人  
  12.             .singleResult();  
  13.       
  14.     //设置流程变量【基本类型】  
  15.     taskService.setVariable(task.getId(), "请假人", assignee);  
  16.     taskService.setVariableLocal(task.getId(), "请假天数",3);  
  17.     taskService.setVariable(task.getId(), "请假日期"new Date());  
  18.       
  19.       
  20. }  
	/**设置流程变量*/
	@Test
	public void setProcessVariables(){
		String processInstanceId = "1301";//流程实例ID
		String assignee = "张三";//任务办理人
		TaskService taskService = processEngine.getTaskService();//获取任务的Service,设置和获取流程变量
		
		//查询当前办理人的任务ID
		Task task = taskService.createTaskQuery()
				.processInstanceId(processInstanceId)//使用流程实例ID
				.taskAssignee(assignee)//任务办理人
				.singleResult();
		
		//设置流程变量【基本类型】
		taskService.setVariable(task.getId(), "请假人", assignee);
		taskService.setVariableLocal(task.getId(), "请假天数",3);
		taskService.setVariable(task.getId(), "请假日期", new Date());
		
		
	}

     

     对应数据库表:act_ru_variable

     Activiti进阶(4)——流程变量的设置和获取

 

             2.JavaBean类型

 

     首先,定义JavaBean类。

 

[java] view plain copy print?
  1. package cn.gome.d_processVariables;  
  2.   
  3. public class Person implements java.io.Serializable{  
  4.       
  5.     private static final long serialVersionUID = 8379071759772449529L;  
  6.       
  7.     private Integer id;  
  8.     private String name;  
  9.     private String education;  
  10.       
  11.     public Integer getId() {  
  12.         return id;  
  13.     }  
  14.     public void setId(Integer id) {  
  15.         this.id = id;  
  16.     }  
  17.     public String getName() {  
  18.         return name;  
  19.     }  
  20.     public void setName(String name) {  
  21.         this.name = name;  
  22.     }  
  23.       
  24. }  
package cn.gome.d_processVariables;

public class Person implements java.io.Serializable{
	
	private static final long serialVersionUID = 8379071759772449529L;
	
	private Integer id;
	private String name;
	private String education;
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}


            然后,通过JavaBean设置流程变量。这里要注意的是,Javabean类型设置获取流程变量,除了需要这个javabean实现了Serializable接口外,还要求流程变量对象的属性不能发生编号,否则抛出异常。

 

 

[java] view plain copy print?
  1. /**设置流程变量?去哪个表里查*/  
  2. @Test  
  3. public void setProcessVariables(){  
  4.     String processInstanceId = "1301";//流程实例ID  
  5.     String assignee = "张三";//任务办理人  
  6.     TaskService taskService = processEngine.getTaskService();//获取任务的Service,设置和获取流程变量  
  7.       
  8.     //查询当前办理人的任务ID  
  9.     Task task = taskService.createTaskQuery()  
  10.             .processInstanceId(processInstanceId)//使用流程实例ID  
  11.             .taskAssignee(assignee)//任务办理人  
  12.             .singleResult();  
  13.       
  14.     //设置流程变量【javabean类型】  
  15.     Person p = new Person();  
  16.     p.setId(1);  
  17.     p.setName("周江霄");  
  18.     taskService.setVariable(task.getId(), "人员信息", p);  
  19.     System.out.println("流程变量设置成功~~");  
  20. }  
	/**设置流程变量?去哪个表里查*/
	@Test
	public void setProcessVariables(){
		String processInstanceId = "1301";//流程实例ID
		String assignee = "张三";//任务办理人
		TaskService taskService = processEngine.getTaskService();//获取任务的Service,设置和获取流程变量
		
		//查询当前办理人的任务ID
		Task task = taskService.createTaskQuery()
				.processInstanceId(processInstanceId)//使用流程实例ID
				.taskAssignee(assignee)//任务办理人
				.singleResult();
		
		//设置流程变量【javabean类型】
		Person p = new Person();
		p.setId(1);
		p.setName("周江霄");
		taskService.setVariable(task.getId(), "人员信息", p);
		System.out.println("流程变量设置成功~~");
	}

 

     数据库对应表:act_ru_variable,细心的你可以看到,通过JavaBean设置的流程变量,在act_ru_variable中存储的类型为serializable,变量真正存储的地方在act_ge_bytearray中。

 

Activiti进阶(4)——流程变量的设置和获取

 

     数据库对应表:act_ge_bytearray

 

   Activiti进阶(4)——流程变量的设置和获取

 

     、获取流程变量

 

     1.基本类型

 

 

[java] view plain copy print?
  1. /**获取流程变量*/  
  2. @Test  
  3. public void getProcessVariables(){  
  4.     String processInstanceId = "1301";//流程实例ID  
  5.     String assignee = "张三";//任务办理人  
  6.     TaskService taskService = processEngine.getTaskService();  
  7.     //获取当前办理人的任务ID  
  8.     Task task = taskService.createTaskQuery()  
  9.             .processInstanceId(processInstanceId)  
  10.             .taskAssignee(assignee)  
  11.             .singleResult();  
  12.       
  13.     //获取流程变量【基本类型】  
  14.     String person = (String) taskService.getVariable(task.getId(), "请假人");  
  15.     Integer day = (Integer) taskService.getVariableLocal(task.getId(), "请假天数");  
  16.     Date date = (Date) taskService.getVariable(task.getId(), "请假日期");  
  17.     System.out.println(person+"  "+day+"   "+date);  
  18.       
  19. }  
	/**获取流程变量*/
	@Test
	public void getProcessVariables(){
		String processInstanceId = "1301";//流程实例ID
		String assignee = "张三";//任务办理人
		TaskService taskService = processEngine.getTaskService();
		//获取当前办理人的任务ID
		Task task = taskService.createTaskQuery()
				.processInstanceId(processInstanceId)
				.taskAssignee(assignee)
				.singleResult();
		
		//获取流程变量【基本类型】
		String person = (String) taskService.getVariable(task.getId(), "请假人");
		Integer day = (Integer) taskService.getVariableLocal(task.getId(), "请假天数");
		Date date = (Date) taskService.getVariable(task.getId(), "请假日期");
		System.out.println(person+"  "+day+"   "+date);
		
	}

 

 

           2.JavaBean类型

 

 

[java] view plain copy print?
  1. /**获取流程变量*/  
  2. @Test  
  3. public void getProcessVariables(){  
  4.     String processInstanceId = "1301";//流程实例ID  
  5.     String assignee = "张三";//任务办理人  
  6.     TaskService taskService = processEngine.getTaskService();  
  7.     //获取当前办理人的任务ID  
  8.     Task task = taskService.createTaskQuery()  
  9.             .processInstanceId(processInstanceId)  
  10.             .taskAssignee(assignee)  
  11.             .singleResult();  
  12.       
  13.     //获取流程变量【javaBean类型】  
  14.     Person p = (Person) taskService.getVariable(task.getId(), "人员信息");  
  15.     System.out.println(p.getId()+"  "+p.getName());  
  16.     System.out.println("获取成功~~");  
  17. }  
	/**获取流程变量*/
	@Test
	public void getProcessVariables(){
		String processInstanceId = "1301";//流程实例ID
		String assignee = "张三";//任务办理人
		TaskService taskService = processEngine.getTaskService();
		//获取当前办理人的任务ID
		Task task = taskService.createTaskQuery()
				.processInstanceId(processInstanceId)
				.taskAssignee(assignee)
				.singleResult();
		
		//获取流程变量【javaBean类型】
		Person p = (Person) taskService.getVariable(task.getId(), "人员信息");
		System.out.println(p.getId()+"  "+p.getName());
		System.out.println("获取成功~~");
	}

 

 

     三、查询历史流程变量

 

 

[java] view plain copy print?
  1. /**查询历史的流程变量*/  
  2. @Test  
  3. public void getHistoryProcessVariables(){  
  4.     List<HistoricVariableInstance> list = processEngine.getHistoryService()  
  5.             .createHistoricVariableInstanceQuery()//创建一个历史的流程变量查询  
  6.             .variableName("请假天数")  
  7.             .list();  
  8.       
  9.     if(list != null && list.size()>0){  
  10.         for(HistoricVariableInstance hiv : list){  
  11.             System.out.println(hiv.getTaskId()+"  "+hiv.getVariableName()+"     "+hiv.getValue()+"      "+hiv.getVariableTypeName());  
  12.         }  
  13.     }                 
  14. }  
	/**查询历史的流程变量*/
	@Test
	public void getHistoryProcessVariables(){
		List<HistoricVariableInstance> list = processEngine.getHistoryService()
				.createHistoricVariableInstanceQuery()//创建一个历史的流程变量查询
				.variableName("请假天数")
				.list();
		
		if(list != null && list.size()>0){
			for(HistoricVariableInstance hiv : list){
				System.out.println(hiv.getTaskId()+"  "+hiv.getVariableName()+"		"+hiv.getValue()+"		"+hiv.getVariableTypeName());
			}
		}				
	}

 

 

        对应数据库表:act_ru_execution

 

Activiti进阶(4)——流程变量的设置和获取