流程变量

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry; import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.junit.Test; /**
* 在执行流程的过程中产生数据称为流程变量
* 1、流程变量的生命周期
* 就是流程实例
* 2、流程变量和流程实例的关系
* 流程变量必须和流程实例绑定在一起
* 3、通过什么样的方法把一个流程变量存放在流程实例中
* 4、通过什么样的方法把一个流程变量从流程实例中提取出来
* 5、把一个对象放入到流程变量中,该对象必须实现对象的序列化
* @author zd
*
*/
public class VariablesTest {
/**
* 涉及到的表
* act_hi_varinst varinst:变量实例
* act_ru_variable 存放当前正在执行的流程实例的流程变量
* execution_id_:流程实例ID
* proc_inst_id_:流程实例ID
* 可以根据流程实例ID获取到该流程实例的流程变量
*/
@Test
public void testStartPI(){
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("当启动流程实例的时候", "启动流程实例的流程变量");
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getRuntimeService()
//当启动流程实例的时候添加流程变量
.startProcessInstanceByKey("qingjia", variables);
} /**
* 在完成任务的时候,设置流程变量
*/
@Test
public void testFinishTask(){
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("请假天数", 3);
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getTaskService()
.complete("805", variables);
} /**
* 在流程实例的任何时候(只要流程实例没有结束),设置流程变量
*/
@Test
public void testSetVariablesWhenPI(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getRuntimeService()
/**
* executionId 针对哪一个流程实例设置流程变量
* variableName 变量的名称
* value 变量的值
*/
.setVariable("801", "aaa", "aaa");
} /**
* 怎么样得到流程变量
*/
@Test
public void testGetVariables(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取指定的流程实例下面的所有的流程变量
Map<String, Object> variables = processEngine.getRuntimeService()
.getVariablesLocal("801");
for (Entry<String, Object> entry:variables.entrySet()) {
if(entry.getValue() instanceof Person){
Person person = (Person)entry.getValue();
System.out.println(person.getName());
}else{
System.out.println(entry.getKey());
System.out.println(entry.getValue());
} }
} /**
* 在流程实例的任何时候(只要流程实例没有结束),设置流程变量
*/
@Test
public void testSetVariables_Object_WhenPI(){
Person person = new Person();
person.setPid(1L);
person.setName("王二麻子");
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getRuntimeService()
/**
* executionId 针对哪一个流程实例设置流程变量
* variableName 变量的名称
* value 变量的值
*/
.setVariable("801", "person", person);
}
}

person类

import java.io.Serializable;

public class Person implements Serializable{
private Long pid;
private String name;
public Long getPid() {
return pid;
}
public void setPid(Long pid) {
this.pid = pid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} }

给任务赋值任务的执行人

在进入该节点之前就能确定任务的执行者

流程图中设置流程变量,如下:

import java.util.HashMap;
import java.util.Map; import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.junit.Test; /**
* <userTask id="申请请假" name="申请请假" activiti:assignee="#{applicator}"></userTask>
* 如果一个任务节点的执行人是通过上面的形式赋值的,那么在进入该节点之前,必须给变量applicator赋值(通过流程变量)
* @author zd
*
*/
public class Task1Test {
@Test
public void testDeploy(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getRepositoryService()
.createDeployment()
.addClasspathResource("com/itheima10/activiti/task/task1.bpmn")
.deploy();
} /**
* 在启动流程实例的时候,设置流程变量,给aplicator赋值
*/
@Test
public void testStartPI(){
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("applicator", "张三");
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getRuntimeService()
.startProcessInstanceById("myProcess:1:1204",variables);
} /**
* 在完成请假申请任务的时候,设置流程变量
*/
@Test
public void testFinishApplicatorTask(){
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("manager", "李四");
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getTaskService()
.complete("1305", variables);
} /**
* 在完成部门经理审批的任务的时候,设置流程变量,给总经理任务的执行人赋值
*/
@Test
public void testFinishManagerTask(){
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("boss", "王五");
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getTaskService()
.complete("1403", variables);
} /**
* 完成总经理的任务
*/
@Test
public void testFinishBossTask(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getTaskService()
.complete("1503");
}
}

在进入该节点之后,才要确定节点的执行者是谁

流程图如下:

1、可以通过MyTaskListener的方式给任务赋值执行人
 <userTask id="部门经理审批" name="部门经理审批">
<extensionElements>
<activiti:taskListener event="create" class="com.itheima10.activiti.task.MyTaskListener"></activiti:taskListener>
</extensionElements>
</userTask>
当进入上述的userTask节点之后,立刻执行MyTaskListener的notify方法
delegateTask.setAssignee(manager);就是给MyTaskListener所在的任务节点赋值任务的执行人
说明:该类是由activiti内部调用的,不是由spring容器产生的,所以在notify方法中没有办法使用spring的声明式事务处理产生事务
2、可以通过代码的方式设置任务的执行人
processEngine.getTaskService()
.setAssignee(taskId, userId);
通过该方式也可以给正在执行的任务赋值任务的执行人

package com.itheima10.activiti.task;

import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.task.Task;
import org.junit.Test; public class Task2Test {
@Test
public void testDeploy(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getRepositoryService()
.createDeployment()
.addClasspathResource("com/itheima10/activiti/task/task2.bpmn")
.deploy();
} /**
* 启动流程实例,并且给流程变量 applicator,manager赋值
*/
@Test
public void testStartPI(){
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("applicator", "张三");
variables.put("manager","李四");
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getRuntimeService()
.startProcessInstanceById("task2:1:2104", variables);
} /**
* 根据张三查询任务
*/
@Test
public void testQueryTaskByAssignee(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
List<Task> tasks = processEngine.getTaskService()
.createTaskQuery()
.taskAssignee("张三")
.orderByTaskCreateTime()
.desc()
.list(); for (Task task : tasks) {
System.out.println(task.getAssignee());
System.out.println(task.getName());
}
} @Test
public void testFinishTask(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getTaskService().complete("2206"); }
}
package com.itheima10.activiti.task;

import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener; public class MyTaskListener implements TaskListener{
/**
*
*/
private static final long serialVersionUID = 1830618442071409874L; @Override
public void notify(DelegateTask delegateTask) {
String manager = delegateTask.getVariable("manager").toString();
delegateTask.setAssignee(manager); /**
* 获得spring容器中的bean
      *   WebApplicationContext ac =
* WebApplicationContextUtils.
* getWebApplicationContext(ServletActionContext.getServletContext());
IEmployeeService employeeService = (IEmployeeService) ac.getBean("employeeService");
*/
}
}

Activiti5工作流笔记二的更多相关文章

  1. Activiti5工作流笔记一

    介绍工作流 网上工作流的定义一大堆,这里就不去复制了,通俗的理解,工作流就是类似OA系统中请假审批.报销审批等一系列流程,下级提交的申请只有直系领导才能审批,其他人是没有权限的,而只有直系领导审批通过 ...

  2. Activiti5工作流笔记四

    排他网关(ExclusiveGateWay) 流程图 部署流程定义+启动流程实例 查询我的个人任务 完成我的个人任务 并行网关(parallelGateWay) 流程图 部署流程定义+启动流程实例 查 ...

  3. Activiti5工作流笔记三

    组任务 直接指定办理人 流程图如下: import java.util.HashMap; import java.util.List; import java.util.Map; import org ...

  4. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  5. jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}

    笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...

  6. Mastering Web Application Development with AngularJS 读书笔记(二)

    第一章笔记 (二) 一.scopes的层级和事件系统(the eventing system) 在层级中管理的scopes可以被用做事件总线.AngularJS 允许我们去传播已经命名的事件用一种有效 ...

  7. Python 学习笔记二

    笔记二 :print 以及基本文件操作 笔记一已取消置顶链接地址 http://www.cnblogs.com/dzzy/p/5140899.html 暑假只是快速过了一遍python ,现在起开始仔 ...

  8. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  9. webpy使用笔记(二) session/sessionid的使用

    webpy使用笔记(二) session的使用 webpy使用系列之session的使用,虽然工作中使用的是django,但是自己并不喜欢那种大而全的东西~什么都给你准备好了,自己好像一个机器人一样赶 ...

随机推荐

  1. 类加载器 ClassLoder详解

    一.类加载器定义 从作用的角度来认识类加载器:(根据API文档) 1.类加载器是一个负责加载类的对象,而ClassLoader是一个抽象类.类加载器将xxx.class文件加载到JVM,生成xxx的C ...

  2. 不使用IDE,用maven命令打包war项目及出现的问题解决(最全攻略,亲测有效)

    第一次在博客园写博客,写的不好大家见谅啊!! 一.首先,在用maven打包之前,一定确认好你使用的jdk版本和maven的版本,最好就是用jdk1.8和maven3.3以上的,版本太低了容易出现一些意 ...

  3. mac使用brew或者tomcat启动jenkins后配置文件路径

    在mac下使用brew命令或tomcat安装jenkins,启动后要输入密码,密码不知道,又找不到config.xml,找了半天原来 config.xml在/Users/qiaojiafei/.jen ...

  4. Qt-QML-Popup,弹层界面编写

    随着接触Qt的时间的增加,也逐渐的发现了Qt 的一些不人信话的一些地方,不由的想起一句话,也不知道是在哪里看到的了“一切变成语言都是垃圾,就C++还可以凑合用”大致意思是这样.最近项目的祝界面框架都基 ...

  5. Linux命令应用大词典-第16章 归档和压缩

    16.1 tar:进行归档和压缩 16.2 gzip:压缩或解压缩gzip文件 16.3 gunzip:解压缩gzip文件 16.4 zcmp:比较gzip压缩文件 16.5 zdiff:比较gzip ...

  6. vim基本命令笔记

    两种模式 -编辑模式:可以进行正常的编辑操作 左下方显示 -- INSERT -- "在命令模式下输入 i 能够进入编辑模式" -命令模式:可以通过命令 左下方什么也不显示 &qu ...

  7. 【转】Haml 这货是啥? 附参考

    Haml是一种用来描述任何XHTML web document的标记语言,它是干净,简单的.而且也不用内嵌代码.Haml的职能就是替代那些内嵌代码的page page templating syste ...

  8. maven 安装、配置

    简介: maven 大大提高项目开发速度     编译---打包---测试--安装   一条龙 maven将项目构建的过程标准化,每一个阶段使用一个命令完成,下面是构建过程一些阶段 清理 mvn cl ...

  9. vim—自动缩进(编写Python脚本)

    大神推荐使用vim编写Python脚本,学而时积之,不亦乐乎! 使用vim编写Python脚本的时候不能正常缩进,需要修改vimrc文件 Ubuntu系统下vimrc文件的位置: $ cd /etc/ ...

  10. Halcon和visionPro的比较

    很多朋友会问到visionpro和halcon这两款机器视觉软件,到底学哪个好呢,今天重码网就给大家讲一讲: 首先比较下两者的优缺点: halcon: 提供的图像算法要比Visionpro多,也就是说 ...