0、流程变量要用的表:
select * FROM act_ru_variable; -- 正在执行的流程变量表
select * FROM act_hi_varinst; -- 流程变量历史表
1、流程变量的作用:
(1)用来传递业务参数(比如请假天数,请假原因等);
(2)指定连线完成任务(同意和拒绝);
(3)动态指定任务的办理人.
2、加载路径:
(1)从classPath目录下加载指定名称的文件:
InputStream inbpmn = this.getClass().getClassLoader().getResourceAsStream("diagrams/helloWord.bpmn");
InputStream inpng = this.getClass().getClassLoader().getResourceAsStream("diagrams/helloWord.png");
(2)从classPath目录下加载指定名称的文件:
InputStream inputStreambpmn = this.getClass().getResourceAsStream("/diagrams/processVariables.bpmn");
InputStream inputStreampng = this.getClass().getResourceAsStream("/diagrams/processVariables.png");
(3)从当前包下加载指定名称的文件:
InputStream inputStreambpmn = this.getClass().getResourceAsStream("diagrams/processVariables.bpmn");
InputStream inputStreampng = this.getClass().getResourceAsStream("diagrams/processVariables.png");
3、工作流中变量的类型:
file:///D:/就业班/工作流/activiti-5.13/docs/userguide/index.html 从下载的工作流文件夹中查看,在这也页面中搜索 Variable Types
设置流程变量使用javaBean对象设置
当一个javaBean(实现序列化)放置到流程变量中,要求javaBean中的属性不能改变,如果改变再次获取时会报错
解决方案:在person对象中生成一个固定的序列化编号
4、注意:
//可以使用任务对象,也可以使用正在执行的服务对象设置或者获取设置的变量
//RuntimeService runtimeService = processEngine.getRuntimeService();
TaskService taskService = processEngine.getTaskService();
5、setVariable和setVariableLocal的区别
// 设置的变量与当前任务绑定,只有使用当前任务的id才能查询,当这个任务完成时下一个任务不能获取到当前任务设置的变量。
// taskService.setVariableLocal(taskId, "请假天数", 5);
setVariable:设置流程变量时当流程变量名称相同后一次设置的值会覆盖掉前一次设置的值,而且可以看到TASK_ID的字段上不会存放任务id值
setVariableLocal:与当前任务绑定,只有使用当前任务的id才能查询,当这个任务完成时下一个任务不能获取到当前任务设置的变量。设置的值就算是名称相同也不会覆盖,会根据任务id存储。
6、代码:
package itheima.processDefinition;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.zip.ZipInputStream;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.repository.Deployment;
import org.junit.Test;
public class ProcessVariable {
// 获得工作流引擎对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/* 部署流程定义(从inputStream中部署流程定义) */
@Test
public void deloymentProcessDefinitionFromZip() {
// 根据反射获取zip文件转换成对应的流
InputStream inputStreambpmn = this.getClass().getResourceAsStream("/diagrams/processVariables.bpmn");
InputStream inputStreampng = this.getClass().getResourceAsStream("/diagrams/processVariables.png");
// 部署对象
Deployment deploy = processEngine.getRepositoryService()// 与流程定义相关的service
.createDeployment()// 创建部署对象
.name("流程变量")// 添加部署名称
.addInputStream("processVariables.bpmn", inputStreambpmn)// 使用资源文件名称(要求:与资源文件名称要一致)和输入流完成部署
.addInputStream("processVariables.png", inputStreampng).deploy();// 完成部署;
System.out.println("部署id:" + deploy.getId());
System.out.println("部署名称:" + deploy.getName());
}
/* 启动流程实例 */
@Test
public void startProcessInstance() {
// 流程定义的key
String processDefinitionKey = "processVariables";
org.activiti.engine.runtime.ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和流程对象有关的service
.startProcessInstanceByKey(processDefinitionKey);
// 使用流程定义的key启动流程实例,key与helloWord.bpmn中的id值相同
System.out.println("流程实例id:" + processInstance.getId());
System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
}
/* 完成我的任务 */
@Test
public void completeMyTask() {
// 任务id
String taskId = "1404";
processEngine.getTaskService()// 获取与正在执行任务的service
.complete(taskId);
System.out.println("完成任务,任务编号是:" + taskId);
}
/* 设置流程变量 */
@Test
public void setProcessVariable() {
// 获得任务的服务对象
TaskService taskService = processEngine.getTaskService();
// 任务id
String taskId = "1602";// 提交申请任务id
/*
* Map<String, Object> variables = new HashMap<>(); // 设置流程变量要使用基本数据类型
* variables.put("请假天数", 5);
* variables.put("请假开始时间", new Date());
* variables.put("请假原因", "回家探亲--改变");
* taskService.setVariables(taskId,variables);
*/
// 设置的变量与当前任务绑定,只有使用当前任务的id才能查询,当这个任务完成时下一个任务不能获取到当前任务设置的变量。
// taskService.setVariableLocal(taskId, "请假天数", 5);
// 设置流程变量使用javaBean对象设置
/*
* 当一个javaBean(实现序列化)放置到流程变量中,要求javaBean中的属性不能改变,如果改变再次获取时会报错
* 解决方案:在person对象中生成一个固定的序列化编号
*/
//注意:前一次设置的值如果key相同会被后一次的值覆盖掉
Person person = new Person();
person.setId("6");
person.setName("使用自定义对象设置流程变量");
person.setAge(10);
taskService.setVariable(taskId, "人员信息", person);
System.out.println("设置变量成功!");
}
/* 获取流程变量 */
@Test
public void getProcessVariable() {
// 也可以使用正在执行的服务对象设置或者获取设置的变量
// RuntimeService runtimeService = processEngine.getRuntimeService();
// 获得任务的服务对象
TaskService taskService = processEngine.getTaskService();
// 任务id
String taskId = "1602";
// 根据任务id查询设置的变量值
/*
* Map<String, Object> variables = taskService.getVariables(taskId); //
* 遍历map集合输出设置的变量值 Iterator<Entry<String, Object>> iterator =
* variables.entrySet().iterator(); while (iterator.hasNext()) {
* Entry<String, Object> entry = iterator.next();
* System.out.println(entry.getKey() + ":" + entry.getValue()); }
*/
// 获取从javaBean对象中设置的流程变量
Person p = (Person) taskService.getVariable(taskId, "人员信息");
System.out.println(p.getId() + ":" + p.getName() + ":" + p.getAge());
}
/* 查看历史流程变量的历史表 */
@Test
public void findHistoryProcessVariable() {
List<HistoricVariableInstance> list = processEngine.getHistoryService()// 获得历史流程对象
.createHistoricVariableInstanceQuery()// 创建历史查询变量对象
.variableName("请假天数")// 要查询的变量名称
.list();
if (list != null && list.size() > 0) {
for (HistoricVariableInstance his : list) {
System.out.println(his.getId() + " " + his.getProcessInstanceId() + " " + his.getVariableName()
+ " " + his.getVariableTypeName() + " " + his.getValue());
}
}
}
}
package itheima.processDefinition;
import java.io.Serializable;
//要想使用自定义对象设置流程变量就要使用工作流变量规定的类型,其中有一个实现序列化的类型
public class Person implements Serializable{
/**
* 生成序列化id
*/
private static final long serialVersionUID = 1L;
private String id;
private String name;
private int age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}