博客
关于我
【Activiti 基础篇四】流程变量设置与获取方式
阅读量:99 次
发布时间:2019-02-25

本文共 3551 字,大约阅读时间需要 11 分钟。

上篇我们讲述了关于流程定义的CRUD操作,本篇我们则来对“流程变量”进行分析与认识,开篇我们首先我明确两个问题

1、何为“流程变量”?

2、流程变量在项目种有何作用?

知道了流程变量是什么以及他的价值在哪里,我们来谈谈对于流程变量的设置和获取方式。不管是设置流程变量还是获取流程变量,本篇我们主要了解两种方法

我们常见的就是基本类型,比如我们请假的例子,看我的设置流程变量的方法

// 设置流程变量	@Test	public void setProcessVariables() {		String processInstanceId = "1704";		// 任务的办理人		String assignee = "李四";		TaskService taskService = processEngine.getTaskService(); // 获取任务的service,设置和获取流程变量		// 查询当前办理人的任务ID		Task task = taskService.createTaskQuery()				.processInstanceId(processInstanceId).taskAssignee(assignee)				.singleResult();		// 设置流程变量(基本类型)		// 使用任务ID,流程变量的名称和流程变量的值,设置流程变量		taskService.setVariable(task.getId(), "请假人", assignee);		taskService.setVariableLocal(task.getId(), "请假天数", 3);		taskService.setVariable(task.getId(), "请假日期", new Date());		System.out.println("设置成功");	}
我们给这个流程设置了三个参数,请假人,请假天数,请假日期。看我们如何通过基本类型去获取:

// 获取流程变量	@Test	public void getProcessVariables() {		String processInstanceId = "1701";		// 任务的办理人		String assignee = "李四";		TaskService taskService = processEngine.getTaskService(); // 获取任务的service,设置和获取流程变量		// 查询当前办理人的任务ID		Task task = taskService.createTaskQuery()				.processInstanceId(processInstanceId).taskAssignee(assignee)				.singleResult();		// 获取流程变量(基本类型)方式一		// 使用任务ID,流程变量的名称获取流程变量的值		String person = (String) taskService.getVariable(task.getId(), "请假人");		Integer day = (Integer) taskService.getVariableLocal(task.getId(),				"请假天数");		Date date = (Date) taskService.getVariable(task.getId(), "请假日期");		System.out.println(person + "  " + day + "   " + date);		System.out.println("获取成功");	}
其实方式很简单,我们就是通过一个一个赋值然后输出结果,很容易理解。

除了基本类型之外,我们还有一种JavaBean的方式,设置流程变量方式如下:

// 设置流程变量	@Test	public void setProcessVariables() {		String processInstanceId = "1704";		// 任务的办理人		String assignee = "李四";		TaskService taskService = processEngine.getTaskService(); // 获取任务的service,设置和获取流程变量		// 查询当前办理人的任务ID		Task task = taskService.createTaskQuery()				.processInstanceId(processInstanceId).taskAssignee(assignee)				.singleResult();		// 设置流程变量(javabean类型)		Person p = new Person();		p.setId(1);		p.setName("huohuo");		taskService.setVariable(task.getId(), "人员信息", p);		System.out.println("设置成功");	}
有图我们可以看到我们需要定义一个Person类,这就是javaBean类型的调用。

Person类:

package cn.itcast.d_processVariables;import java.io.Serializable;public class Person implements Serializable{	/**	 * 基本实体	 */	private static final long serialVersionUID = 1090466323915193381L;	private Integer id;		private String name;    //省略get,set方法

需要注意两点,Javabean类型设置流程变量,需要实现Servializable接口,形成序列化。为什么要实现序列化接口?因为在数据库中有一个type类型,通过type类型去act_ge_bytearray读取你所存放的文件,你必须要赋值才能将其获取出来,如图:

如果为实现,单元测试的结果如下:

所以很容易就能看到错误是什么。

设置完流程变量,我们通过javabean的方式将其获取出来

// 获取流程变量	@Test	public void getProcessVariables() {		// 实例ID		String processInstanceId = "2601";		// 任务的办理人		String assignee = "李四";		TaskService taskService = processEngine.getTaskService(); // 获取任务的service,设置和获取流程变量		// 查询当前办理人的任务ID		Task task = taskService.createTaskQuery()				.processInstanceId(processInstanceId).taskAssignee(assignee)				.singleResult();		// 获取流程变量(javabean类型) 方式二		Person person = (Person) taskService.getVariable(task.getId(), "人员信息");		System.out.println(person.getId() + "           " + person.getName());		System.out.println("获取成功");	}
最后输出结果:

在获取流程定义的过程中,除了要注意上述实现之外,还要注意 除了需要这个javabean实现了Serializable接口外,还要求流程变量对象的属性不能发生编号,否则抛出异常。

为了避免这种情况,我们可以Add generated serial version ID,如图

大概意思就是添加一个默认的ID,避免出错。

//添加序列IDprivate static final long serialVersionUID = 6757393795687480331L;
流程实例的两种方式我们明了了,但是要注意:流程变量的获取是针对流程实例(1个流程的),每个流程实例获取的流程变量是不同的。不管是基本类型还是Javabean类型都有需要注意的地方,在使用过程中我们必须要注意。

你可能感兴趣的文章
nano 编辑
查看>>
NASA网站曝严重漏洞,或将沦为黑客钓鱼网站?
查看>>
Nash:轻量级、安全且可靠的脚本语言
查看>>
NAS、SAN和DAS的区别
查看>>
NAS个人云存储服务器搭建
查看>>
NAT PAT故障排除实战指南:从原理到技巧的深度探索
查看>>
nat 网卡间数据包转发_你是不是从来没有了解过光纤网卡,它跟普通网卡有什么区别?...
查看>>
NAT-DDNS内网穿透技术,快解析DDNS的优势
查看>>
NAT-DDNS内网穿透技术,快解析DDNS的优势
查看>>
NAT-DDNS内网穿透技术,解决动态域名解析难题
查看>>
natapp搭建外网服务器
查看>>
NativePHP:使用PHP构建跨平台桌面应用的新框架
查看>>
Native方式运行Fabric(非Docker方式)
查看>>
Nat、端口映射、内网穿透有什么区别?
查看>>
Nat、端口映射、内网穿透有什么区别?
查看>>
nat打洞原理和实现
查看>>
NAT技术
查看>>
NAT模式/路由模式/全路由模式 (转)
查看>>
NAT模式下虚拟机centOs和主机ping不通解决方法
查看>>
NAT的两种模式SNAT和DNAT,到底有啥区别?
查看>>