流程变量

  1. import java.util.HashMap;
  2. import java.util.Map;
  3. import java.util.Map.Entry;
  4.  
  5. import org.activiti.engine.ProcessEngine;
  6. import org.activiti.engine.ProcessEngines;
  7. import org.junit.Test;
  8.  
  9. /**
  10. * 在执行流程的过程中产生数据称为流程变量
  11. * 1、流程变量的生命周期
  12. * 就是流程实例
  13. * 2、流程变量和流程实例的关系
  14. * 流程变量必须和流程实例绑定在一起
  15. * 3、通过什么样的方法把一个流程变量存放在流程实例中
  16. * 4、通过什么样的方法把一个流程变量从流程实例中提取出来
  17. * 5、把一个对象放入到流程变量中,该对象必须实现对象的序列化
  18. * @author zd
  19. *
  20. */
  21. public class VariablesTest {
  22. /**
  23. * 涉及到的表
  24. * act_hi_varinst varinst:变量实例
  25. * act_ru_variable 存放当前正在执行的流程实例的流程变量
  26. * execution_id_:流程实例ID
  27. * proc_inst_id_:流程实例ID
  28. * 可以根据流程实例ID获取到该流程实例的流程变量
  29. */
  30. @Test
  31. public void testStartPI(){
  32. Map<String, Object> variables = new HashMap<String, Object>();
  33. variables.put("当启动流程实例的时候", "启动流程实例的流程变量");
  34. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  35. processEngine.getRuntimeService()
  36. //当启动流程实例的时候添加流程变量
  37. .startProcessInstanceByKey("qingjia", variables);
  38. }
  39.  
  40. /**
  41. * 在完成任务的时候,设置流程变量
  42. */
  43. @Test
  44. public void testFinishTask(){
  45. Map<String, Object> variables = new HashMap<String, Object>();
  46. variables.put("请假天数", 3);
  47. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  48. processEngine.getTaskService()
  49. .complete("805", variables);
  50. }
  51.  
  52. /**
  53. * 在流程实例的任何时候(只要流程实例没有结束),设置流程变量
  54. */
  55. @Test
  56. public void testSetVariablesWhenPI(){
  57. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  58. processEngine.getRuntimeService()
  59. /**
  60. * executionId 针对哪一个流程实例设置流程变量
  61. * variableName 变量的名称
  62. * value 变量的值
  63. */
  64. .setVariable("801", "aaa", "aaa");
  65. }
  66.  
  67. /**
  68. * 怎么样得到流程变量
  69. */
  70. @Test
  71. public void testGetVariables(){
  72. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  73. //获取指定的流程实例下面的所有的流程变量
  74. Map<String, Object> variables = processEngine.getRuntimeService()
  75. .getVariablesLocal("801");
  76. for (Entry<String, Object> entry:variables.entrySet()) {
  77. if(entry.getValue() instanceof Person){
  78. Person person = (Person)entry.getValue();
  79. System.out.println(person.getName());
  80. }else{
  81. System.out.println(entry.getKey());
  82. System.out.println(entry.getValue());
  83. }
  84.  
  85. }
  86. }
  87.  
  88. /**
  89. * 在流程实例的任何时候(只要流程实例没有结束),设置流程变量
  90. */
  91. @Test
  92. public void testSetVariables_Object_WhenPI(){
  93. Person person = new Person();
  94. person.setPid(1L);
  95. person.setName("王二麻子");
  96. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  97. processEngine.getRuntimeService()
  98. /**
  99. * executionId 针对哪一个流程实例设置流程变量
  100. * variableName 变量的名称
  101. * value 变量的值
  102. */
  103. .setVariable("801", "person", person);
  104. }
  105. }

person类

  1. import java.io.Serializable;
  2.  
  3. public class Person implements Serializable{
  4. private Long pid;
  5. private String name;
  6. public Long getPid() {
  7. return pid;
  8. }
  9. public void setPid(Long pid) {
  10. this.pid = pid;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18.  
  19. }

给任务赋值任务的执行人

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

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

  1. import java.util.HashMap;
  2. import java.util.Map;
  3.  
  4. import org.activiti.engine.ProcessEngine;
  5. import org.activiti.engine.ProcessEngines;
  6. import org.junit.Test;
  7.  
  8. /**
  9. * <userTask id="申请请假" name="申请请假" activiti:assignee="#{applicator}"></userTask>
  10. * 如果一个任务节点的执行人是通过上面的形式赋值的,那么在进入该节点之前,必须给变量applicator赋值(通过流程变量)
  11. * @author zd
  12. *
  13. */
  14. public class Task1Test {
  15. @Test
  16. public void testDeploy(){
  17. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  18. processEngine.getRepositoryService()
  19. .createDeployment()
  20. .addClasspathResource("com/itheima10/activiti/task/task1.bpmn")
  21. .deploy();
  22. }
  23.  
  24. /**
  25. * 在启动流程实例的时候,设置流程变量,给aplicator赋值
  26. */
  27. @Test
  28. public void testStartPI(){
  29. Map<String, Object> variables = new HashMap<String, Object>();
  30. variables.put("applicator", "张三");
  31. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  32. processEngine.getRuntimeService()
  33. .startProcessInstanceById("myProcess:1:1204",variables);
  34. }
  35.  
  36. /**
  37. * 在完成请假申请任务的时候,设置流程变量
  38. */
  39. @Test
  40. public void testFinishApplicatorTask(){
  41. Map<String, Object> variables = new HashMap<String, Object>();
  42. variables.put("manager", "李四");
  43. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  44. processEngine.getTaskService()
  45. .complete("1305", variables);
  46. }
  47.  
  48. /**
  49. * 在完成部门经理审批的任务的时候,设置流程变量,给总经理任务的执行人赋值
  50. */
  51. @Test
  52. public void testFinishManagerTask(){
  53. Map<String, Object> variables = new HashMap<String, Object>();
  54. variables.put("boss", "王五");
  55. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  56. processEngine.getTaskService()
  57. .complete("1403", variables);
  58. }
  59.  
  60. /**
  61. * 完成总经理的任务
  62. */
  63. @Test
  64. public void testFinishBossTask(){
  65. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  66. processEngine.getTaskService()
  67. .complete("1503");
  68. }
  69. }

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

流程图如下:

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);
通过该方式也可以给正在执行的任务赋值任务的执行人

  1. package com.itheima10.activiti.task;
  2.  
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6.  
  7. import org.activiti.engine.ProcessEngine;
  8. import org.activiti.engine.ProcessEngines;
  9. import org.activiti.engine.task.Task;
  10. import org.junit.Test;
  11.  
  12. public class Task2Test {
  13. @Test
  14. public void testDeploy(){
  15. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  16. processEngine.getRepositoryService()
  17. .createDeployment()
  18. .addClasspathResource("com/itheima10/activiti/task/task2.bpmn")
  19. .deploy();
  20. }
  21.  
  22. /**
  23. * 启动流程实例,并且给流程变量 applicator,manager赋值
  24. */
  25. @Test
  26. public void testStartPI(){
  27. Map<String, Object> variables = new HashMap<String, Object>();
  28. variables.put("applicator", "张三");
  29. variables.put("manager","李四");
  30. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  31. processEngine.getRuntimeService()
  32. .startProcessInstanceById("task2:1:2104", variables);
  33. }
  34.  
  35. /**
  36. * 根据张三查询任务
  37. */
  38. @Test
  39. public void testQueryTaskByAssignee(){
  40. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  41. List<Task> tasks = processEngine.getTaskService()
  42. .createTaskQuery()
  43. .taskAssignee("张三")
  44. .orderByTaskCreateTime()
  45. .desc()
  46. .list();
  47.  
  48. for (Task task : tasks) {
  49. System.out.println(task.getAssignee());
  50. System.out.println(task.getName());
  51. }
  52. }
  53.  
  54. @Test
  55. public void testFinishTask(){
  56. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  57. processEngine.getTaskService().complete("2206");
  58.  
  59. }
  60. }
  1. package com.itheima10.activiti.task;
  2.  
  3. import org.activiti.engine.delegate.DelegateTask;
  4. import org.activiti.engine.delegate.TaskListener;
  5.  
  6. public class MyTaskListener implements TaskListener{
  7. /**
  8. *
  9. */
  10. private static final long serialVersionUID = 1830618442071409874L;
  11.  
  12. @Override
  13. public void notify(DelegateTask delegateTask) {
  14. String manager = delegateTask.getVariable("manager").toString();
  15. delegateTask.setAssignee(manager);
  16.  
  17. /**
  18. * 获得spring容器中的bean
          *   WebApplicationContext ac =
  19. * WebApplicationContextUtils.
  20. * getWebApplicationContext(ServletActionContext.getServletContext());
  21. IEmployeeService employeeService = (IEmployeeService) ac.getBean("employeeService");
  22. */
  23. }
  24. }

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. RMI入门HelloWorld

    java RMI(Remote Method Invocation)是一种基于java远程调用技术,是对RPC的java实现,可以在不同主机上进行通信与方法调用.PRC通信原理如图: 方法调用从客户对 ...

  2. BZOJ4247_挂饰_KEY

    题目传送门 背包的变形,不得不说卡了我很久(估计是下午睡傻了). 设f[i][j]为前i个物品剩下j个挂钩. f[i][j]=max(f[i-1][j],f[i-1][max(j-a[i].x,0)+ ...

  3. spring-boot、spring-data-jpa、hibernate整合

    一.Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. ...

  4. macOS 10.13 High Sierra PHP开发环境配置

    命令:sudo rm /usr/local/mysql sudo rm -rf /usr/local/mysql* sudo rm -rf /Library/StartupItems/MySQLCOM ...

  5. iOS - Foundation相关

    1.NSString         A.创建的方式:            stringWithFormat:格式化字符串  ,创建字符串对象在堆区域            @"jack& ...

  6. possible new indexes 出现了

  7. hdu1058Humble Numbers(动态规划)

    Humble Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  8. Selenium(Python) ddt读取Excel文件数据驱动

    首先, 引入xlrd模块: ExcelDDT.py: import unittestfrom time import sleep from ddt import ddt, datafrom selen ...

  9. Python3安装pywin32模块

    假如你安装的是Python3.6, 那么可以直接用PyCharm或者pip安装pywin32模块: 但是, 由于我安装的是Python3.7, 所以PyCharm或者pip都无法成功安装pywin32 ...

  10. java后台接受web前台传递的数组参数

    前台发送:&warning_type[]=1,2 &warning_type=1,2 后台接收:(@RequestParam(value = "param[]") ...