一、流程变量的作用

1.用来传递业务参数

2.指定连线完成任务(同意或拒绝)

3.动态指定任务办理人

二、测试代码块

Person类

package com.xingshang.processVariables;

import java.io.Serializable;

public class Person implements Serializable {

    /**
*
*/
private static final long serialVersionUID = -4801857004005971862L; 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;
} }

流程变量测试代码

package com.xingshang.processVariables;

import java.io.InputStream;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
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.activiti.engine.runtime.ProcessInstance;
import org.junit.Test; public class ProcessVariablesTest {
//工作引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); /**
* 部署流程定义(从inputStream)
*/
@Test
public void deploymentProcessDefinition_inputStream(){
InputStream inputStreambpmn = this.getClass().getResourceAsStream("/diagrams/processVariables.bpmn");
InputStream inputStreampng = this.getClass().getResourceAsStream("/diagrams/processVariables.png");
Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署相关的service
.createDeployment()//创建一个部署对象
.name("流程定义")//添加部署的名称
.addInputStream("processVariables.bpmn", inputStreambpmn)//使用资源文件的名称(要求:与资源文件的名称要一致)和输入流来完成部署
.addInputStream("processVariables.png", inputStreampng)//使用资源文件的名称和输入流来完成部署
.deploy();//完成部署
System.out.println("部署ID: " + deployment.getId());//
System.out.println("部署名称: " + deployment.getName());//
} /**
* 启动流程实例
*/
@Test
public void startProcessInstance(){
//流程定义的key
String processDefinitionKey = "processVariables";
ProcessInstance pi = processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的service
.startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动流程实例,key对应HelloWorld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动 System.out.println("流程实例ID: " + pi.getId());//流程实例ID
System.out.println("流程定义ID: " + pi.getProcessDefinitionId());//流程定义ID
} /**
* 设置流程变量
*/
@Test
public void setVariables(){
//与任务相关(正在执行)
TaskService taskService = processEngine.getTaskService();
//任务ID
String taskId = ""; //一、设置流程变量,使用基本数据类型
/*taskService.setVariableLocal(taskId, "请假天数", 3);//与任务ID绑定
taskService.setVariable(taskId, "请假日期", new Date());
taskService.setVariable(taskId, "请假原因", "回家探亲");*/ /**
* 二、设置流程变量,使用javabean类型
*
* 注意:
* 当一个javabean(实现序列化)放置到流程变量中,要求javabean的属性不能再发生变化
* 如果发生变化,在获取的时候,会抛出异常
* 解决方案:在Person对象中添加:
* private static final long serialVersionUID = -4801857004005971862L;
* 同时实现 Person实现 Serializable 接口
*/ Person p = new Person();
p.setId(10);
p.setName("翠花"); taskService.setVariable(taskId, "人员信息", p); System.out.println("设置流程变量成功!");
} /**
* 获取流程变量
*/
@Test
public void getVariables(){
//与任务相关(正在执行)
TaskService taskService = processEngine.getTaskService(); //任务ID
String taskID = "";
//一、获取流程变量,使用基本数据类型
/*Integer days = (Integer) taskService.getVariable(taskID, "请假天数");
Date date = (Date) taskService.getVariable(taskID, "请假日期");
String resean = (String) taskService.getVariable(taskID, "请假原因"); System.out.println("请假天数: " + days);
System.out.println("请假日期: " + date);
System.out.println("请假原因: " + resean);*/ //二、获取流程变量,使用javabean类型
Person p = (Person)taskService.getVariable(taskID, "人员信息");
System.out.println(p.getId() + " " + p.getName()); } /**
* 模拟设置和获取流程变量的场景
*/
@Test
public void setAndGetVariables(){
//与流程实例,执行对象相关(正在执行)
RuntimeService runtimeService = processEngine.getRuntimeService();
//与任务相关(正在执行)
TaskService taskService = processEngine.getTaskService(); //设置流程变量
// runtimeService.setVariable(executionId, variableName, value);//表示使用执行对象ID,和流程变量的名称,来设置流程变量的值(一次只能设置一个值)
// runtimeService.setVariables(executionId, variables);//表示使用执行对象ID,和map集合来设置流程变量,map集合的key就是流程变量的名称,map集合的value就是流程变量的值(一次可以设置多个值) // taskService.setVariable(taskId, variableName, value);//表示使用任务ID,和流程变量的名称,来设置流程变量的值(一次只能设置一个值)
// taskService.setVariables(taskId, variables);//表示使用任务ID,和map集合来设置流程变量,map集合的key就是流程变量的名称,map集合的value就是流程变量的值(一次可以设置多个值) // runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);//启动流程实例的同时,可以设置流程变量,用map集合
// taskService.complete(taskId, variables);//完成任务的同时,可以设置流程变量,用map集合 //获取流程变量
// runtimeService.getVariable(executionId, variableName);//表示使用执行对象ID,和流程变量的名称,来获取流程变量的值
// runtimeService.getVariables(executionId);//表示使用执行对象ID,来获取流程变量的值,将流程变量放到map集合中,map集合的key就是流程变量的名称,map集合的value就是流程变量的值
// runtimeService.getVariables(executionId, variableNames);//表示使用执行对象ID,来获取流程变量的值,通过设置流程变量的名称,存放到一个集合中,获取指定流程变量名称的流程变量的值,值存放在map集合中 // taskService.getVariable(taskId, variableName);//表示使用任务ID,和流程变量的名称,来获取流程变量的值
// taskService.getVariables(taskId);//表示使用任务ID,来获取流程变量的值,将流程变量放到map集合中,map集合的key就是流程变量的名称,map集合的value就是流程变量的值
// taskService.getVariables(taskId, variableNames);//表示使用任务ID,来获取流程变量的值,通过设置流程变量的名称,存放到一个集合中,获取指定流程变量名称的流程变量的值,值存放在map集合中 } /**
* 完成我的任务
*/
@Test
public void completeMyPersonalTask(){ String taskId = ""; processEngine.getTaskService()//与正在执行的任务管理相关的Sercice
.complete(taskId);
System.out.println("任务完成: 任务Id: " + taskId);
} /**
* 查询流程变量的历史表
*/
@Test
public void findHistoryProcessVariables(){
List<HistoricVariableInstance> list = processEngine.getHistoryService()
.createHistoricVariableInstanceQuery()//创建一个历史的流程变量查询对象
.variableName("请假天数")
.list(); if(list != null && list.size() > 0){
for(HistoricVariableInstance h : list){
System.out.println(h.getId() + " " + h.getProcessInstanceId() + " " +
h.getVariableTypeName() + " " + h.getVariableName() + h.getTaskId() + " " +
h.getClass() + " " + h.getValue());
System.out.println("------------------------------------------");
}
}
} }

png图

三、流程变量总结

1.在流程执行或任务执行的过程中,用于设置和获取变量,使用流程变量在流程传递的过程中传递业务参数

对应的表

a.)  act_ru_variable  :正在执行的流程变量表

b.)  act_hi_varinst     :流程变量历史表

2.setVariable和setVariableLocal的区别

setVariable:

    设置流程变量的时候,流程变量名称相同的时候,后一次的值替代前一次的值,而且可以看到TASK_ID的字段不会存放任务ID的值

setVariableLocal:

    a  )设置流程变量的时候,针对当前活动的节点设置流程变量,如果一个流程中存在两个活动节点,对每个活动节点都设置流程变量,即使流程变量的名称相同,后一次的版本的值也不会替代前一次版本的值,它会使用不同的任务ID作为标识,存放两个流程变量值,而且可以看到TASK_ID的字段会存放任务ID的值

    b  )还有,使用setVariableLocal说明流程变量绑定了当前的任务,当流程继续执行时,下个任务获取不到这个流程变量(因为正在执行的流程变量中没有这条数据),所以查询正在执行的任务时不能查询到我们需要的数据,此时需要查询历史的流程变量

最新文章

  1. ABP框架 - 设置管理
  2. TOMCAT-报错The BASEDIR environment variable is not defined correctly
  3. Android:使用代理服务器安装SDKs
  4. 第一章-第二题Unity3D游戏引擎相关--By林培文
  5. 尚学堂Spring视频教程(五):Spring AOP
  6. Jquery.Datatables 导出excel
  7. Socket原理与编程基础(转)
  8. php函数描述及例子
  9. Python应用与实践
  10. SQL Server笔记
  11. 《Web Scraping With Python》Chapter 2的学习笔记
  12. AJAX异步、sweetalert、Cookie和Session初识
  13. Python练习五
  14. Vue 2.3、2.4 知识点小结
  15. LeetCode69.x的平方根
  16. 【读书笔记】iOS-网络-三种错误
  17. Kafka安装kafka-manager
  18. Flask接通微信公众号
  19. RabbitMQ---8、连接断开处理-断线重连
  20. linux 下安装python3

热门文章

  1. SQL Server 2008 导入MDF数据库文件
  2. SharedPreferences具体解释(一)——基础知识
  3. react 打包后,项目部署完毕,刷新页面报错(404)
  4. Mac环境下反编译apk
  5. 使用Maven整合SSH总结
  6. linux标准输入输出错误输出
  7. 改变listview中item选中时文字的颜色
  8. Nginx 变量漫谈
  9. JQuery不能加载click事件的问题
  10. saltstack之nginx部署