工作流笔记第四天_流程变量

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;
}

}

时间: 2024-11-10 07:46:27

工作流笔记第四天_流程变量的相关文章

工作流笔记第三天_流程实例

0.流程实例的表 -- 流程实例,执行对象,任务-- 1.解析.bpmn后得到的流程定义规则的信息,工作流系统就是按照流程定义的规则执行的.select * FROM act_ru_execution; -- 正在执行的执行对象表 select * FROM act_hi_procinst; -- 流程实例的历史表select * FROM act_ru_task; -- 正在执行的任务表(只有节点是UserTask的时候,该表中存在数据)select * FROM act_hi_taskins

工作流笔记第0天_学习要点

Activity工作流学习要点 1. 1个插件 在Eclipse中安装Activity插件,让你可以在Eclipse中绘制Activity工作流图 2. 1个引擎 ProcessEngine对象,Activity工作流引擎.这是Activiti工作的核心.负责生成流程运行时的各种实例及数据.监控和管理流程的运行. 所有的操作都是从获取引擎开始的,所以一般会把引擎作为全局变量 ProcessEngine processEngine =ProcessEngines.getDefaultProcess

Dynamic CRM 2013学习笔记(四十一)流程4 - 异步工作流(Workflow)用法图解

在CRM 2013 里,工作流被分成二类:异步工作流和实时工作流.异步工作流依赖一个windows 服务: Microsoft Dynamics CRM Asynchronous Processing Service , 这个服务必须在CRM 服务器上运行,否则异步工作流不会运行.异步工作流有可能不会立即执行,如果想要立即执行的工作流,可以考虑用实时工作流.CRM 里把它当作实体,所以可以在高级查找里查找它,还可以基于它生成报表.下面详细介绍如何使用异步工作流. 为了使用工作流,要注意权限是否打

Dynamic CRM 2013学习笔记(四十三)流程6 - 自定义流程活动

当我们在流程里添加步骤时,有一些默认的步骤,像创建.更新.发邮件等,但如果你想加一个里面没有的步骤,比如发SMS消息,或者调用一个外部的web service,怎么办?这时就只能自定义一个流程活动了.下面将详细介绍如何创建一个自定义的流程活动.   1. 打开vs2012,新建一个项目:   需要引用CRM 的二个dll :  Microsoft.Xrm.Sdk;  Microsoft.Xrm.Sdk.Workflow;   2. 删除默认的 Activity1. xaml ,新建一个类: us

Dynamic CRM 2013学习笔记(四十)流程3 - 对话(Dialog)用法图解

我们将用对话来实现一个简单的满意度调查,下一个问题依赖于上一个问题.对话是同步的,不同于工作流既可以是同步也可以是异步的:对话可以跟用户互动:对话只能手动开始:对话只支持 .Net Framework 4.0.   一.创建对话 1. 打开 Settings > Process, 点击New 按钮 2. 输入Process Name,选择Dialog   3. 点击ok后,就可以看到对话的设计界面 输入参数是用于把参数从父对话传到子对话:变量用于存储计算的数据或字符串以便后面的页面使用.   4

Java学习笔记(四):流程控制

if语句 if判断语句比较简单,具体有下面的几种写法: 1 int i = 0; 2 // if 判断 3 if (i == 0) 4 { 5 // to do something 6 } 7 // if else 判断 8 if (i == 1) 9 { 10 // to do something 11 } 12 else 13 { 14 // to do something 15 } 16 // if else if 判断 17 if (i == 1) 18 { 19 // to do so

工作流笔记第二天_流程定义的CRUD

0.流程定义的表 -- Deployment 部署对象和流程定义相关的表-- 1.一次部署的多个文件的信息,对于不需要的流程可以删除或修改select * FROM act_re_deployment; -- 部署对象表select * FROM act_re_procdef; -- 流程定义表select * FROM act_ge_bytearray; -- 资源文件表select * FROM act_ge_property; -- 主键生成策略表,下一个流程的编号 1.部署流程定义的三种

BOS项目 第10天(activiti工作流第二天,流程变量、组任务、排他网关、spring整合activiti、项目中实现流程定义管理)

BOS项目笔记 第10天 今天内容安排: 1.流程变量(设置.获取) 2.组任务(候选人.候选组) 3.排他网关使用 4.spring整合activiti 5.将activiti应用到bos项目中 6.在bos项目中实现流程定义管理(部署.查询.查看png.删除) 1. 流程变量 1.1 设置流程变量的方式 l 方式一:启动流程实例时设置 l 方式二:办理任务时设置 l 方式三:使用RuntimeService的set方法设置 l 方式四:使用TaskService的set方法设置 注意:如果设

C++ Primer笔记2_四种类型转换_异常机制

1.类型转换 命名的强制类型转换: 有static_cast.dynamic_cast.const_cast.reinterpret_cast static_cast: 编译器隐式执行的任何类型转换都可以由static_cast完成 当一个较大的算术类型赋值给较小的类型时,可以用static_cast进行强制转换. 可以将void*指针转换为某一类型的指针 可以将基类指针强制转换为派生类指针,但是不安全. 无法将const转化为nonconst,这个只有const_cast才可以办得到 举例: