Activiti 学习笔记五:流程变量

网友投稿 848 2022-10-16

Activiti 学习笔记五:流程变量

Activiti 学习笔记五:流程变量

流程变量在整个工作流中扮演很重要的作用。例如:请假流程中有请假天数、请假原因等一些参数都为流程变量的范围。流程变量的作用域范围是只对应一个流程实例。也就是说各个流程实例的流程变量是不相互影响的。流程实例结束完成以后流程变量还保存在数据库中(存放到流程变量的历史表中)。

一、部署流程定义

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());//

说明:

输入流加载资源文件的3种方式

二、启动流程实例

/** 启动流程实例 */ @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 = "2104"; /** 一:设置流程变量,使用基本数据类型 */ // taskService.setVariableLocal(taskId, "请假天数", 5);//与任务ID绑定 // taskService.setVariable(taskId, "请假日期", new Date()); // taskService.setVariable(taskId, "请假原因", "回家探亲,一起吃个饭"); /** 二:设置流程变量,使用javabean类型 */ /** * 当一个javabean(实现序列号)放置到流程变量中,要求javabean的属性不能再发生变化 * 如果发生变化,再获取的时候,抛出异常 * * 解决方案:在Person对象中添加: private static final long serialVersionUID = * 6757393795687480331L; 同时实现Serializable */ Person p = new Person(); p.setId(20); p.setName("翠花"); taskService.setVariable(taskId, "人员信息(添加固定版本)", p); System.out.println("设置流程变量成功!"); }

说明:

流程变量的作用域就是流程实例,所以只要设置就行了,不用管在哪个阶段设置基本类型设置流程变量,在taskService中使用任务ID,定义流程变量的名称,设置流程变量的值。Javabean类型设置流程变量,需要这个javabean实现了Serializable接口设置流程变量的时候,向act_ru_variable这个表添加数据

四、获取流程变量

/** 获取流程变量 */ @Test public void getVariables() { /** 与任务(正在执行) */ TaskService taskService = processEngine.getTaskService(); // 任务ID String taskId = "2104"; /** 一:获取流程变量,使用基本数据类型 */ // 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() + " "

说明:

流程变量的获取针对流程实例(即1个流程),每个流程实例获取的流程变量时不同的使用基本类型获取流程变量,在taskService中使用任务ID,流程变量的名称,获取流程变量的值。Javabean类型设置获取流程变量,除了需要这个javabean实现了Serializable接口外,还要求流程变量对象的属性不能发生变化,否则抛出异常。解决方案,固定序列化ID

五、模拟流程变量的设置和获取的场景

/** 模拟设置和获取流程变量的场景 */ 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集合中

说明:

RuntimeService对象可以设置流程变量和获取流程变量TaskService对象可以设置流程变量和获取流程变量流程实例启动的时候可以设置流程变量任务办理完成的时候可以设置流程变量流程变量可以通过名称/值的形式设置单个流程变量流程变量可以通过Map集合,同时设置多个流程变量Map集合的key表示流程变量的名称Map集合的value表示流程变量的值

六、查询历史的流程变量

/** 查询流程变量的历史表 */ @Test public void findHistoryProcessVariables() { List list = processEngine.getHistoryService()// .createHistoricVariableInstanceQuery()// 创建一个历史的流程变量查询对象 .variableName("请假天数").list(); if (list != null && list.size() > 0) { for (HistoricVariableInstance hvi : list) { System.out.println(hvi.getId() + " " + hvi.getProcessInstanceId() + " " + hvi.getVariableName() + " " + hvi.getVariableTypeName() + " " + hvi.getValue()); System.out.println("###############################################"); } } }

说明: 历史的流程变量查询,指定流程变量的名称,查询act_hi_varinst表(也可以针对,流程实例ID,执行对象ID,任务ID查询)

七、流程变量的支持的类型

Type name

Description

string

Value is threaded as a java.lang.String. Raw JSON-text value is used when writing a variable.

integer

Value is threaded as a java.lang.Integer. When writing, JSON number value is used as base for conversion, falls back to JSON text.

short

Value is threaded as a java.lang.Short. When writing, JSON number value is used as base for conversion, falls back to JSON text.

long

Value is threaded as a java.lang.Long. When writing, JSON number value is used as base for conversion, falls back to JSON text.

double

Value is threaded as a java.lang.Double. When writing, JSON number value is used as base for conversion, falls back to JSON text.

boolean

Value is threaded as a java.lang.Boolean. When writing, JSON boolean value is used for conversion.

date

Value is treated as a java.util.Date. When writing, the JSON text will be converted using ISO-8601 date format.

binary

Binary variable, treated as an array of bytes. The value attribute is null, the valueUrl contains an URL pointing to the raw binary stream.

serializable

Serialized representation of a Serializable Java-object. As with the binary type, the value attribute is null, the valueUrl contains an URL pointing to the raw binary stream. All serializable variables (which are not of any of the above types) will be exposed as a variable of this type.

从图中可以看出包括了大部分封装类型和Date、String和实现了Serializable接口的类的类型。

八、总结

作者:jiankunking

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:OS学习笔记六:文件系统
下一篇:Caffe框架实现YOLOv2
相关文章

 发表评论

暂时没有评论,来抢沙发吧~