Activiti流程变量五步曲 ——by fightingKing
http://blog.csdn.net/zwk626542417/article/details/46648139
一、前言
上一篇文章我们将流程实例的启动与查询,任务的办理查询都进行了介绍,我们这篇文章来介绍activiti中的流程变量。
二、正文
流程变量与我们平常理解的变量是一样的,只不过是用在了我们activiti中,所以称为流程变量,流程变量在整个工作流扮演着很重要的角色。
例如,请假流程中有请假天数、请假原因等一些参数都是流程变量使用的范围,流程变量的作用域范围是只对应一个流程实例。也就是说各个流程实例的流程变量是不互相影响的。流程实例结束完成以后流程变量还保存在数据库中(存放在流程变量的历史表中)。
如图:
关于流程实例的例子,我们先来看下流程图的processVariables.bpmn的配置文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
- <process id="processVariables" name="processVariables【流程请假】" isExecutable="true">
- <startEvent id="startevent1" name="Start"></startEvent>
- <endEvent id="endevent1" name="End"></endEvent>
- <userTask id="usertask1" name="提交申请"></userTask>
- <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
- <userTask id="usertask2" name="审批【总经理】" activiti:assignee="王二"></userTask>
- <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
- <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
- </process>
- <bpmndi:BPMNDiagram id="BPMNDiagram_processVariables">
- <bpmndi:BPMNPlane bpmnElement="processVariables" id="BPMNPlane_processVariables">
- <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
- <omgdc:Bounds height="35.0" width="35.0" x="350.0" y="90.0"></omgdc:Bounds>
- </bpmndi:BPMNShape>
- <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
- <omgdc:Bounds height="35.0" width="35.0" x="350.0" y="420.0"></omgdc:Bounds>
- </bpmndi:BPMNShape>
- <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
- <omgdc:Bounds height="55.0" width="105.0" x="315.0" y="190.0"></omgdc:Bounds>
- </bpmndi:BPMNShape>
- <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
- <omgdc:Bounds height="55.0" width="105.0" x="315.0" y="300.0"></omgdc:Bounds>
- </bpmndi:BPMNShape>
- <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
- <omgdi:waypoint x="367.0" y="125.0"></omgdi:waypoint>
- <omgdi:waypoint x="367.0" y="190.0"></omgdi:waypoint>
- </bpmndi:BPMNEdge>
- <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
- <omgdi:waypoint x="367.0" y="245.0"></omgdi:waypoint>
- <omgdi:waypoint x="367.0" y="300.0"></omgdi:waypoint>
- </bpmndi:BPMNEdge>
- <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
- <omgdi:waypoint x="367.0" y="355.0"></omgdi:waypoint>
- <omgdi:waypoint x="367.0" y="420.0"></omgdi:waypoint>
- </bpmndi:BPMNEdge>
- </bpmndi:BPMNPlane>
- </bpmndi:BPMNDiagram>
- </definitions>
一个很简单的流程图processVariables.png:
部署流程定义:
- /**
- * 部署流程定义(从inputStream)
- */
- @Test
- public void deploymentProcessDefinition_inputStream() {
- ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
- 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());
- }
运行结果:
部署ID:701
部署名称:流程定义
启动流程实例:
- /**
- * 启动流程实例
- */
- @Test
- public void startProcessInstance() {
- // 流程定义的key
- String processDefinitionKey = "processVariables";
- ProcessInstance pi = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的service
- .startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例,key对应processVariables文件中的id的属性值,使用key值启动,默认是按照最新版本进行启动
- System.out.println("流程实例ID:" + pi.getId());
- System.out.println("流程定义ID:" + pi.getProcessDefinitionId());
- System.out.println("流程实例ID" + pi.getProcessInstanceId());
- }
运行结果:
流程实例ID:801
流程定义ID:processVariables:1:704
流程实例ID801
查询任务
- /**
- * 查询任务通过流程实例id
- */
- @Test
- public void findTask(){
- String processInstanceId="801";
- List<HistoricTaskInstance> list = processEngine.getHistoryService()//与历史数据(历史表)相关的service
- .createHistoricTaskInstanceQuery()//创建历史任务实例查询
- .processInstanceId(processInstanceId)
- .list();
- if(list!=null && list.size()>0){
- for(HistoricTaskInstance hti:list){
- System.out.println(hti.getId()+" "+hti.getName()+" "+hti.getProcessInstanceId()+" "+hti.getStartTime()+" "+hti.getEndTime()+" "+hti.getDurationInMillis());
- System.out.println("################################");
- }
- }
- }
运行结果:
804 提交申请 801 Fri Jun 26 10:55:02 CST2015 null null
################################
关于部署流程定义、启动流程实例和查询正在办理的任务我们前面的文章已经介绍过了,所以我们不再详细介绍,下面开始我们的设置流程变量,设置流程变量我们这里提供了两种方式,分别是使用基本数据类型和使用javabean的方法,同意获取流程变量也是不一样的:
使用基本数据类型:
设置流程变量
- /**
- * 设置流程变量
- */
- @Test
- public void setVariables() {
- // 与任务相关的service,正在执行的service
- TaskService taskService = processEngine.getTaskService();
- // 任务ID
- String taskId = "804";
- // 1.设置流程变量,使用基本数据类型
- taskService.setVariable(taskId, "请假天数", 7);// 与任务ID邦德
- taskService.setVariable(taskId, "请假日期", new Date());
- taskService.setVariableLocal(taskId, "请假原因", "回去探亲,一起吃个饭123");
- System.out.println("设置流程变量成功!");
- }
运行结果:
设置流程变量成功!
获取流程变量
- /**
- * 获取流程变量
- */
- @Test
- public void getVariables() {
- // 与任务(正在执行的service)
- TaskService taskService = processEngine.getTaskService();
- // 任务Id
- String taskId = "804";
- // 1.获取流程变量,使用基本数据类型
- Integer days = (Integer) taskService.getVariable(taskId, "请假天数");
- Date date = (Date) taskService.getVariable(taskId, "请假日期");
- String reason = (String) taskService.getVariable(taskId, "请假原因");
- System.out.println("请假天数:" + days);
- System.out.println("请假日期:" + date);
- System.out.println("请假原因:" + reason);
- }
运行结果:
请假天数:7
请假日期:Fri Jun 2611:07:28 CST 2015
请假原因:回去探亲,一起吃个饭123
使用javabean
JavaBean的Person类
- package com.tgb;
- import java.io.Serializable;
- import java.util.Date;
- public class Person implements Serializable {
- private static final long serialVersionUID = 361866001729020143L;
- //请假天数
- private int id;
- //请假人
- private String name;
- //请假原因
- private String note;
- //请假时间
- private Date date;
- public Date getDate() {
- return date;
- }
- public void setDate() {
- this.date = new Date();
- }
- public String getNote() {
- return note;
- }
- public void setNote(String note) {
- this.note = note;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
设置流程变量
- /**
- * 设置流程变量
- */
- @Test
- public void setVariables() {
- // 与任务相关的service,正在执行的service
- TaskService taskService = processEngine.getTaskService();
- // 任务ID
- String taskId = "804";
- // 设置流程变量,使用javaBean方法
- /**
- * 当一个javaBean(实现序列号)放置到流程变量中,要求javabean的属性不能在发生变化 如果发生变化,再获取时,抛出异常
- *
- * 解决方案:在person对象中添加: private static final long
- * serialVersionUID="6757393795687480331L"; 同时实现序列号接口
- *
- */
- Person p = new Person();
- p.setName("翠花");
- p.setId(20);
- p.setDate();;
- p.setNote("回去探亲,一起吃个饭123");
- taskService.setVariable(taskId, "人员信息(添加固定版本)", p);
- System.out.println("设置流程变量成功!");
- }
运行结果:
设置流程变量成功!
获取流程变量
- /**
- * 获取流程变量
- */
- @Test
- public void getVariables() {
- // 与任务(正在执行的service)
- TaskService taskService = processEngine.getTaskService();
- // 任务Id
- String taskId = "804";
- // 2.获取流程变量,使用javaBean类型
- Person p = (Person)taskService.getVariable(taskId, "人员信息(添加固定版本)");
- System.out.println(" 请假人: "+p.getName()+" 请假天数: "+p.getId()+" 请假时间:"+ p.getDate()+ " 请假原因: "+p.getNote());
- }
运行结果:
请假人: 翠花 请假天数: 20 请假时间:Fri Jun 26 11:13:44 CST 2015 请假原因: 回去探亲,一起吃个饭123
查询历史流程变量
可以根据变量名称查询该变量的所有历史信息
- 可以根据变量名称查询该变量的所有历史信息
- /**
- * 查询流程变量的历史表
- */
- @Test
- public void findHistoryProcessVariables(){
- List<HistoricVariableInstance> 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("########################################");
- }
- }
- }
流程变量支持的数据类型:
流程变量支持的数据类型包括:TypeName、string、integer、short、long、double、boolean、data、binary、serializable,我们可以看出流程变量支持的包括了大部分封装类型和Date、String和实现了Serializable接口的类的类型。
三、总结
我们这篇文章将流程变量的相关知识进行了介绍,除了介绍流程变量的相关定义外还通过具体代码例子介绍了通过不同方式来设置和获取流程变量以及流程变量支持的数据类型。
Activiti流程变量五步曲 ——by fightingKing的更多相关文章
- 工作流学习——Activiti流程变量五步曲 (zhuan)
http://blog.csdn.net/zwk626542417/article/details/46648139 ***************************************** ...
- 工作流学习——Activiti流程变量五步曲
一.前言 上一篇文章我们将流程实例的启动与查询,任务的办理查询都进行了介绍,我们这篇文章来介绍activiti中的流程变量. 二.正文 流程变量与我们寻常理解的变量是一样的,仅仅只是是用在了我们act ...
- C语言程序设计入门学习五步曲(转发)
笔者在从事教学的过程中,听到同学抱怨最多的一句话是:老师,上课我也能听懂,书上的例题也能看明白,可是到自己动手做编程时,却不知道如何下手.发生这种现象的原因有三个: 一.所谓的看懂听明白,只是很肤浅的 ...
- 工作流学习——Activiti整体认识二步曲 (zhuan)
http://blog.csdn.net/zwk626542417/article/details/46594505 ***************************************** ...
- iOS 之美:iOS Delegate 使用五步曲
在iOS 开发中, 搞清楚Delegate 是需要花些时间的. Delegate 本来是软件架构设计的一种理念.对于像手机这样一个有限的设备,我们需要充分考虑到:内存要尽量省着用: 视图之间的关系要清 ...
- Activiti流程变量
流程变量在整个工作流中扮演很重要的作用 例如:请假流程中有请假天数.请假原因等一些参数都为流程变量的范围.流程变量的作用域范围是流程实例.也就是说各个流程实例的流程变量是不相互影响的. 添加流程变量 ...
- JDK1.8简单配置环境变量---两步曲
鄙人最近重新装完系统之后,在安装和配置jdk1.8的时候,发现网上许多教程配置jdk环境变量时都还在沿用传统的方式配置,但是随着技术的更新,完全没有必要那么麻烦了. 下载和安装jdk的教程,在这里就不 ...
- Activiti第二篇【管理流程定义、执行任务和流程实例、流程变量】
上篇Activiti只是一个快速入门案例,这篇就讲定义.部署.查看任务等等的一些细节[涉及到的数据库表.对象等等]- 管理流程定义 管理流程定义主要涉及到以下的4张表: -- 流程部署相关的表 SEL ...
- Activiti工作流(三)——流程变量
流程变量可以是流程中一系列参数,比如办理人(Assignee),消息(message)等.这些流程变量使得activiti能够应用于更为复杂的业务中,使得流程变得更加灵活可控. 场景(一) 图一:没有 ...
随机推荐
- JavaScript自定义事件和触发(createEvent, dispatchEvent)
$(dom).addEvent("ft", function() { alert("走起"); }); // 创建 var evt = document.cre ...
- Web Deploy 发布网站错误 检查授权和委派设置
Web Deploy发布ASP.NET网站给我们提供方便,配置好后可以很方便地发布网站到IIS服务器. 自安装Web Deploy一年以来,一直都用得好好地. 直到最近,Gitlab-CI自动发布出了 ...
- base64使用
public static void main(String args[]) throws Exception { InputStream in = null; byte[] data = null; ...
- datasnap 的HTTP 调用返回JSON
datasnap 相关设置,就不细说了,直接上函数 uses System.JSON function TServerMethods.Updatehello: Tjsonobject; var tem ...
- HAproxy指南之haproxy实现动静分离(案例篇)
HAproxy指南之haproxy实现动静分离(案例篇) 转自 https://blog.51cto.com/blief/1751806 实际应用环境中,往往需要根据业务请求将相关不同请求跳转 ...
- java反射之获取所有方法及其注解(包括实现的接口上的注解),获取各种标识符备忘
java反射之获取类或接口上的所有方法及其注解(包括实现的接口上的注解) /** * 获取类或接口上的所有方法及方法上的注解(包括方法实现上的注解以及接口上的注解),最完整的工具类,没有现成的工具类 ...
- 根据RadioButtonList动态显示隐藏Div
使用场景 今天在写项目的时候遇到一个需求,注册页面,用户先选择类型继而填表单,所以需要根据选择切换表单,使用的前端框架是MiniUI,但是在实现这个功能的时候mini.get()方法无法得到div元素 ...
- Java第一、二次实训作业
1.有1.2.3.4共4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去掉不满足条件的排列. 代码 pack ...
- webpack4 系列教程(十六):开发模式和生产模式·实战
好文章 https://www.jianshu.com/p/f2d30d02b719
- FJOI2019 划水记
Day0 月考的余温尚未褪去,一周后期中考也将来临.一群被哄来打FJOI的水军,在期中大考必过前一百的死命令之下,仍然不怕死的花三天时间水同步赛.试机的路上乖乖排成两排,居然还有那么一丝春游的悠闲之感 ...