流程变量

来源:互联网 发布:左右音箱测试软件 编辑:程序博客网 时间:2024/06/05 23:04

流程变量

标签(空格分隔): activiti


1.流程变量的本质也是在数据库的一张表中专门用来存储变量信息。使用工作流提供的接口可以方便对流程变量进行存和取。

实例代码如下:
/**
* 获取默认流程引擎实例,会自动读取activiti.cfg.xml文本
*/
private ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();

/**
* 部署流程定义
*/
@Test
public void deploy(){
Deployment deployment=processEngine.getRepositoryService()//获取部署相关Service
.createDeployment() //创建部署对象
.addClasspathResource(“diagrams/StudentLeaveProcess.bpmn”) //加载资源文件
.addClasspathResource(“diagrams/StudentLeaveProcess.png”)
.name(“学生请假流程”)
.deploy(); //部署

System.out.println("流程部署ID:"+deployment.getId());System.out.println("流程部署Name:"+deployment.getName());

}

@Test
public void start() {
ProcessInstance pi=processEngine.getRuntimeService()//运行时Service
.startProcessInstanceByKey(“studentLeaveProcess”);//流程定义表的KEY字段
System.out.println(“流程实例ID:”+pi.getId());
System.out.println(“流程定义ID:”+pi.getProcessDefinitionId());
}

上面的代码对流程进行部署和启动,接着对第一个节点的处理人张三进行任务查询:
/**
* 查看任务
*/
@Test
public void findTask(){
List taskList=processEngine.getTaskService() //任务相关Service
.createTaskQuery() //创建任务查询
.taskAssignee(“王五”) //指定某个人
.list();

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.getProcessDefinitionId());}

}

结果得到张三的任务ID为:
任务ID:50004
任务名称:学生请假申请
任务创建时间:Sun Jun 18 17:54:50 CST 2017
任务委派人:张三
流程实例ID:studentLeaveProcess:2:47504

拿着这个任务ID来讨论本次关于流程变量的知识点。
@Test
public void setVariableValues(){
TaskService taskService=processEngine.getTaskService(); //任务相关service
String taskId=”50004”;
taskService.setVariable(taskId, “days”, 2);
taskService.setVariable(taskId, “date”, new Date());
taskService.setVariable(taskId, “reason”, “发烧了”);
Student student=new Student();
student.setId(1);
student.setName(“张三”);
taskService.setVariable(taskId, “student”, student);//参数支持序列化对象
}

在张三这个节点的时候设置流程变量,由上述代码可知,参数可为一般的流程变量,也可以为可序列号的数据结构,此处为一个可序列号的类,其定义代码如下:
package model;
import java.io.Serializable;
public class Student implements Serializable{

private static final long serialVersionUID=1L;private Integer id;private String name;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;}

}

在后面的节点可以获取这个流程变量:
/**
* 获取流程变量
*
*/
@Test
public void getVariableValues(){
TaskService taskService=processEngine.getTaskService(); //任务相关service
String taskId=”“;
Integer days=(Integer) taskService.getVariable(taskId, “days”);
Date date= (Date)taskService.getVariable(taskId, “date”);
String reason= (String) taskService.getVariable(taskId, “reason”);
Student student= (Student)taskService.getVariable(taskId, “student”);//参数支持序列化对象

System.out.println("请假天数:"+days);System.out.println("请假日期:"+date);System.out.println("请假原因:"+reason);System.out.println("请假对象:"+student.getId()+student.getName());

}

设置流程变量涉及到的表:
select * from act_ru_variable;//运行时流程变量表

下面对学生请假申请这第一个节点进行完成,代码如下:
/**
* 完成任务
*
*/
@Test
public void completeTask(){
processEngine.getTaskService() //任务相关service
.complete(“50004”);
}

这样流程就到了班长审批节点,查看班长李四的任务:
@Test
public void findTask(){
List taskList=processEngine.getTaskService() //任务相关Service
.createTaskQuery() //创建任务查询
.taskAssignee(“李四”) //指定某个人
.list();

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.getProcessDefinitionId());}

}

结果为:
任务ID:55002
任务名称:班长审批
任务创建时间:Sun Jun 18 18:05:38 CST 2017
任务委派人:李四
流程实例ID:studentLeaveProcess:2:47504

拿着李四的任务ID去进行获取流程变量,即请假的具体信息,getVariableValues()这个函数中任务ID为当前任务ID,即李四的55002,,结果如下:
请假天数:2
请假日期:Sun Jun 18 18:02:33 CST 2017
请假原因:发烧了
请假对象:1张三

说明在下一个节点,即班长审批节点,上一个节点的流程变量已经获取到了。同理,在班主任审批节点,也是可以获取到流程变量的。

实现设置流程变量的另一种方式是使用带两个参数的重载函数,代码如下:
/**
* 设置流程变量
*
*/
@Test
public void setVariableValues2(){
TaskService taskService=processEngine.getTaskService(); //任务相关service
String taskId=”50004”;
Student student=new Student();
student.setId(1);
student.setName(“张三”);

Map<String,Object> variables=new HashMap<String,Object>();variables.put("days", 2);variables.put("date", new Date());variables.put("reason", "发烧了");variables.put("student", student);taskService.setVariables(taskId, variables);

}

/**
* 获取流程变量
*
*/
@Test
public void getVariableValues2(){
TaskService taskService=processEngine.getTaskService(); //任务相关service
Map