1什么是流程变量

流程变量在 activiti 中是一个非常重要的角色,流程运转有时需要靠流程变量,业务系统和 activiti
结合时少不了流程变量,流程变量就是 activiti 在管理工作流时根据管理需要而设置的变量。
比如在请假流程流转时如果请假天数大于 3 天则由总经理审核,否则由人事直接审核, 请假天
数就可以设置为流程变量,在流程流转时使用。

注意:虽然流程变量中可以存储业务数据可以通过 activiti api 查询流程变量从而实现 查询业务
数据,但是不建议这样使用,因为业务数据查询由业务系统负责, activiti 设置流程变量是为了流程
执行需要而创建 。

2流程变量类型

 注意:如果将 pojo 存储到流程变量中,必须实现序列化接口 serializable,为了防止由于新增字段无
法反序列化,需要生成 serialVersionUID

3流程变量作用域

流程变量的作用域默认是一个流程实例(processInstance),也可以是一个任务(task)或一个执行实例
(execution),这三个作用域流程实例的范围最大,可以称为 global 变量,任务和执行实例仅仅是针对
一个任务和一个执行实例范围,范围没有流程实例大, 称为 local 变量。

变量名不允许重复
global 变量中变量名不允许重复,设置相同名称的变量,后设置的值会覆盖前设置的变量值。
Local 变量由于在不同的任务或不同的执行实例中,作用域互不影响,变量名可以相同没有影响。
Local 变量名也可以和 global 变量名相同,没有影响。

4流程变量的使用方法

第一步:设置流程变量
第二步:通过 UEL 表达式使用流程变量
1> 可以在 assignee 处设置 UEL 表达式,表达式的值为任务的负责人
比如: ${assignee}, assignee 就是一个流程变量名称
Activiti 获取 UEL 表达式的值 ,即流程变量 assignee 的值 ,将 assignee 的值作为任务的负责人
进行任务分配

2> 可以在连线上设置 UEL 表达式,决定流程走向
比如: ${price>=10000}和${price<10000}: price 就是一个流程变量名称, uel 表达式结果类型为
布尔类型

如果 UEL 表达式是 true,要决定 流程执行走向。

5使用 Global 变量控制流程

5.1需求:

员工创建请假申请单,由部门经理审核,部门经理审核通过后请假 3 天及以下由人事经理直接
审核, 3 天以上先由总经理审核,总经理审核通过再由人事经理存档。

5.2流程程定义

请假天数大于等于 3 连线条件:

请假天数小于 3 连线条件:

5.3设置 global 流程变量

在部门经理审核前设置流程变量,变量值为请假单信息(包括请假天数),部门经理审核后可以根据
流程变量的值决定流程走向。

5.3.1 启动流程时设置

在启动流程时设置流程变量,变量的作用域是整个流程实例。
通过 map<key,value>设置流程变量, map 中可以设置多个变量,这个 key 就是流程变量的名字。

先重新部署项目

   //新的请假流程定义的部署
public static void main(String[] args) {
//1.得到ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService(); //3.部署
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource("diagram/holiday4.bpmn")
.addClasspathResource("diagram/holiday4.png")
.name("请假流程-流程变量")
.deploy(); System.out.println(deploy.getId());
System.out.println(deploy.getName());
}

实体类

/**
* 请假实体类:
* 注意POJO类型,一定要实现Serializable接口,否则在存储这个pojo时就会报异常
*/
public class Holiday implements Serializable {
private Integer id;
private String holidayName;//申请人的名字
private Date beginDate;//开始时间
private Date endDate;//结束日期
private Float num;//请假天数
private String reason;//事由
private String type;//请假类型 public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getHolidayName() {
return holidayName;
} public void setHolidayName(String holidayName) {
this.holidayName = holidayName;
} public Date getBeginDate() {
return beginDate;
} public void setBeginDate(Date beginDate) {
this.beginDate = beginDate;
} public Date getEndDate() {
return endDate;
} public void setEndDate(Date endDate) {
this.endDate = endDate;
} public Float getNum() {
return num;
} public void setNum(Float num) {
this.num = num;
} public String getReason() {
return reason;
} public void setReason(String reason) {
this.reason = reason;
} public String getType() {
return type;
} public void setType(String type) {
this.type = type;
}
}
//启动流程实例,同时还要设置流程变量的值
// act_ge_bytearray
// act_ru_variable
public static void main(String[] args) {
//1.得到ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService(); //3.流程定义的key问题 myProcess_1
String key = "myProcess_1";
Map<String ,Object> map = new HashMap<>(); Holiday holiday = new Holiday();
holiday.setNum(5F);
map.put("holiday",holiday); //4.启动流程实例,并且设置流程变量的值
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key, map); //5.输出实例信息
System.out.println(processInstance.getName());
System.out.println(processInstance.getProcessDefinitionId()); }

说明:
startProcessInstanceByKey(processDefinitionKey, variables)流程变量作用域是一个流
程实例,流程变量使用 Map 存储,同一个流程实例设置变量 map 中 key 相同,后者覆盖前者。

//完成任务  zhangsan  -----lishi----判断流程变量的请假天数,1天----分支:人事经理存档(zhaoliu)
public static void main(String[] args) {
//1.得到ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到TaskService
TaskService taskService = processEngine.getTaskService(); //3.查询当前用户是否有任务
String key = "myProcess_1";
Task task = taskService.createTaskQuery().processDefinitionKey(key)
.taskAssignee("zhaoliu").singleResult(); //4.判断task!=null,说明当前用户有任务
if(task!=null){
System.out.println(task);
taskService.complete(task.getId());
System.out.println("任务执行完毕");
} }

 可以自行测试当天数小于等于3天的时候,是流转不到他的

5.3.2 任务办理时设置

在完成任务时设置流程变量,该流程变量只有在该任务完成后其它结点才可使用该变量,它的作用
域是整个流程实例,如果设置的流程变量的 key 在流程实例中已存在相同的名字则后设置的变量替
换前边设置的变量。
这里需要在创建请假单任务完成时设置流程变量

public class VariableTest2 {

    //完成任务  zhangsan  -----lishi----判断流程变量的请假天数,1天----分支:人事经理存档(zhaoliu)
public static void main(String[] args) {
//1.得到ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到TaskService
TaskService taskService = processEngine.getTaskService(); //3.查询当前用户是否有任务
String key = "myProcess_1";
Task task = taskService.createTaskQuery().processDefinitionKey(key)
.taskAssignee("zhangsan").singleResult(); //初始化一些参数
Map<String ,Object> map = new HashMap<>(); Holiday holiday = new Holiday();
holiday.setNum(5F);
map.put("holiday",holiday); //4.判断task!=null,说明当前用户有任务
if(task!=null){
taskService.complete(task.getId(),map);//完成任务时,设置流程变量的值
System.out.println("任务执行完毕");
} } //启动流程实例
// act_ge_bytearray
// act_ru_variable
public static void main2(String[] args) {
//1.得到ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService(); //3.流程定义的key问题 myProcess_1
String key = "myProcess_1";
/*Map<String ,Object> map = new HashMap<>(); Holiday holiday = new Holiday();
holiday.setNum(5F);
map.put("holiday",holiday);*/ //4.启动流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key); //5.输出实例信息
System.out.println(processInstance.getName());
System.out.println(processInstance.getProcessDefinitionId()); } //新的请假流程定义的部署
public static void main1(String[] args) {
//1.得到ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService(); //3.部署
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource("diagram/holiday4.bpmn")
.addClasspathResource("diagram/holiday4.png")
.name("请假流程-流程变量")
.deploy(); System.out.println(deploy.getId());
System.out.println(deploy.getName());
}
}

5.3.3 通过当前流程实例设置

通过流程实例 id 设置全局变量,该流程实例必须未执行完成。

/**
* 流程变量的测试
*/
public class VariableTest3 { //完成任务 zhangsan -----lishi----判断流程变量的请假天数,1天----分支:人事经理存档(zhaoliu)
public static void main4(String[] args) {
//1.得到ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到TaskService
TaskService taskService = processEngine.getTaskService(); //3.查询当前用户是否有任务
String key = "myProcess_1";
Task task = taskService.createTaskQuery().processDefinitionKey(key)
.taskAssignee("zhangsan").singleResult(); //初始化一些参数
Map<String ,Object> map = new HashMap<>(); Holiday holiday = new Holiday();
holiday.setNum(5F);
map.put("holiday",holiday); //4.判断task!=null,说明当前用户有任务
if(task!=null){
taskService.complete(task.getId(),map);//完成任务时,设置流程变量的值
System.out.println("任务执行完毕");
} } //新加入的:通过流程实例id,来测试流程变量
public static void main(String[] args) {
//1.得到ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService(); //3.流程定义的key问题 myProcess_1
//Map<String ,Object> map = new HashMap<>(); Holiday holiday = new Holiday();
holiday.setNum(5F);
// map.put("holiday",holiday); //4.通过实例id,来设置流程变量
//第一个参数:流程实例的id
//第二个参数:流程变量名
//第三个变量:流程变量名,所对应的值
runtimeService.setVariable("2501","holiday",holiday); } //启动流程实例
// act_ge_bytearray
// act_ru_variable
public static void main2(String[] args) {
//1.得到ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService(); //3.流程定义的key问题 myProcess_1
String key = "myProcess_1";
/*Map<String ,Object> map = new HashMap<>(); Holiday holiday = new Holiday();
holiday.setNum(5F);
map.put("holiday",holiday);*/ //4.启动流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key); //5.输出实例信息
System.out.println(processInstance.getName());
System.out.println(processInstance.getProcessDefinitionId());
System.out.println(processInstance.getId());
} //新的请假流程定义的部署
public static void main1(String[] args) {
//1.得到ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService(); //3.部署
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource("diagram/holiday4.bpmn")
.addClasspathResource("diagram/holiday4.png")
.name("请假流程-流程变量")
.deploy(); System.out.println(deploy.getId());
System.out.println(deploy.getName());
}
}

操作数据库表
设置流程变量会在当前执行流程变量表插入记录,同时也会在历史流程变量表也插入记录。
SELECT * FROM act_ru_variable #当前流程变量表
记录当前运行流程实例可使用的流程变量,包括 global 和 local 变量
Id_:主键
Type_:变量类型
Name_:变量名称
Execution_id_:所属流程实例执行 id, global 和 local 变量都存储
Proc_inst_id_:所属流程实例 id, global 和 local 变量都存储
Task_id_:所属任务 id, local 变量存储
Bytearray_: serializable 类型变量存储对应 act_ge_bytearray 表的 id
Double_: double 类型变量值
Long_: long 类型变量值
Text_: text 类型变量值
SELECT * FROM act_hi_varinst #历史流程变量表
记录所有已创建的流程变量,包括 global 和 local 变量
字段意义参考当前流程变量表

6 local流程变量设置

6.1任务办理时设置

任务办理时设置 local 流程变量,当前运行的流程实例只能在该任务结束前使用,任务结束该变量无
法在当前流程实例使用,可以通过查询历史任务查询。

// 办理任务时设置local流程变量
@Test
public void completTask() {
//任务id
String taskId = "";
TaskService taskService = processEngine.getTaskService();
// 定义流程变量
Map<String, Object> variables = new HashMap<String, Object>();
Holiday holiday = new Holiday ();
holiday.setNum(3);
// 定义流程变量
Map<String, Object> variables = new HashMap<String, Object>();
//变量名是holiday,变量值是holiday对象
variables.put("holiday", holiday);
// 设置local变量,作用域为该任务
taskService.setVariablesLocal(tasked, variables);
taskService.complete(taskId);
}

说明:
设置作用域为任务的 local 变量,每个任务可以设置同名的变量,互不影响。

6.2通过当前任务设置

@Test
public void setLocalVariableByTaskId(){
//当前待办任务id
String taskId="1404";
TaskService taskService = processEngine.getTaskService();
Holiday holiday = new Holiday ();
holiday.setNum(3);
//通过任务设置流程变量
taskService.setVariableLocal(taskId, "holiday", holiday);
//一次设置多个值
//taskService.setVariablesLocal(taskId, variables)
}

注意:
任务 id 必须是当前待办任务 id, act_ru_task 中存在。

Activiti流量变量(九)的更多相关文章

  1. 工作流学习——Activiti流程变量五步曲 (zhuan)

    http://blog.csdn.net/zwk626542417/article/details/46648139 ***************************************** ...

  2. Activiti流程变量五步曲 ——by fightingKing

    http://blog.csdn.net/zwk626542417/article/details/46648139 一.前言 上一篇文章我们将流程实例的启动与查询,任务的办理查询都进行了介绍,我们这 ...

  3. 工作流学习——Activiti流程变量五步曲

    一.前言 上一篇文章我们将流程实例的启动与查询,任务的办理查询都进行了介绍,我们这篇文章来介绍activiti中的流程变量. 二.正文 流程变量与我们寻常理解的变量是一样的,仅仅只是是用在了我们act ...

  4. Activiti流程变量

    流程变量在整个工作流中扮演很重要的作用 例如:请假流程中有请假天数.请假原因等一些参数都为流程变量的范围.流程变量的作用域范围是流程实例.也就是说各个流程实例的流程变量是不相互影响的. 添加流程变量 ...

  5. Activiti 工作流变量的修改方法

    修改方法: //此方法的更新会同时更新 ru_ 和 hi_的数据 @Override public Map<String, Object> updateProcessFormValue(S ...

  6. activiti获取流程图中的所有信息包括变量名

    今天在看activiti的变量的时候,都是由用户来设置变量,我们在后台写代码通过变量设置或取一些参数的时候,非常的不方便. 比如:设置变量的时候通过页面设置 设置之后,我们如何动态的给这个变量设置参数 ...

  7. 跟我一起写Makefile--- 变量(嵌套变量+追加变量+overrid+多行变量+环境变量+目标变量+模式变量)

    目录(?)[-] 使用变量 一变量的基础 二变量中的变量 三变量高级用法 四追加变量值 五override 指示符 六多行变量 七环境变量 八目标变量 九模式变量 使用变量 ———— 在Makefil ...

  8. 最近学习工作流 推荐一个activiti 的教程文档

    全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...

  9. Activiti的分配任务负责人(八)

    1分配任务负责人 1.1 固定分配 在进行业务流程建模时指定固定的任务负责人 在 properties 视图中,填写 Assignee 项为任务负责人.注意事项由于固定分配方式,任务只管一步一步执行任 ...

随机推荐

  1. 11.metasploit辅助模块----基本Exp----ARP欺骗中间人MITM----WordPress破解

    metasploit辅助模块 信息收集 auxiliary scanners 使用metasploitable靶机 桥接 同一局域网 msfconsole nmap -sT 靶机IP nmap -sS ...

  2. centos6.9 安装mysql8

    centos6.9 安装 mysql8 # 安装mysql8 1.下载https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.16-2.el6.x86 ...

  3. [DS+Algo] 005 三种简单排序及其代码实现

    目录 1. 冒泡排序 BubbleSort 1.1 算法描述 1.2 性能分析 1.3 Python 代码实现 2. 选择排序 SelectionSort 2.1 算法描述 2.2 选择排序的主要优点 ...

  4. JSP总结(jsp/EL表达式/核心标签)

    1.概念 jsp,即java Server Pages,java服务器页面. 2.简单介绍 小示例 <%@ page language="java" contentType= ...

  5. Hibernate-Criteria学习笔记

    hibernate_jpa注解 目前最新版的hibernate,5.2,底层整合了jpa,用idea的hibernate工具生成实体时,实体包含了注解的配置文件,缺一不可 如,用户类实体,生成之后是这 ...

  6. Linux下libaio的一个简单例子

    转载:http://www.cnblogs.com/aLittleBitCool/archive/2011/10/18/2216646.html 异步io,很好玩的一个东西,从接口来看,封装的比较厉害 ...

  7. Python 流程控制 超全解析(不可错过)

    流程控制 程序执行结构流程 计算机程序在解决某个具体问题时,包括三种情形,即顺序执行所有的语句.选择执行部分的语句和循环执行部分语句,这正好对应着程序设计中的三种程序执行结构流程:顺序结构.选择结构和 ...

  8. ajax实现异步请求模态登陆

    ajax实现模态登陆 j2ee课程项目实现   Ajax 即"Asynchronous Javascript And XML"(异步 JavaScript 和 XML),是指一种创 ...

  9. Neo4j清空所有数据

    两种方法: 一.用下列 Cypher 语句: match (n) detach delete n 二. 1.停掉服务: 2.删除 graph.db 目录: 3.重启服务. 原文地址:http://ne ...

  10. RabbitMQ几种队列模式