在很多情况下,我们需要多用户共同执行余下流程,比如开会流程

  1. 领导发起开会,选择开会人员(多个)
  2. 每个开会人员接收到通知后需要签到(一名用户签到不会影响到另一位用户的签到)
  3. 签到完成后则流程结束

  如果只使用代理(Assignee、Candidate users、Candidate groups) 将无法解决上述问题,因为即使使用 Candidate users ,但每个用户实际上还是在一个任务里面,其中一个用户完成任务,另外的用户任务也随之完成,此时,就需要用到多实例(多任务)。


以上面开会流程为例:

1. 创建模型

2. 模型相关配置

【领导发起开会】
由于具体是哪个领导发起开会有不确定性(只要是领导都可以发起),所以需要设置代理人属性:
Assignee: ${leader}  -- 此处采用变量形式

为了方便后面的【开发人员签到】流程,我们还需要在【领导发起开会】流程处设置一个流程执行监听器(此操作不是必须,此处只是为了解释动态多实例),在Activiti中,配置监听器需要在模型和JAVA中都进行相应配置:
在JAVA中我们想要创建监听器只需要创建一个类,并实现系统监听器类 ExecutionListener 即可,代码如下:

package com.kenary.activiti.listener;import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;/*** 自定义监听器*/
public class MyExecutionListener implements ExecutionListener {@Overridepublic void notify(DelegateExecution delegateExecution) throws Exception {}
}

可见此时监听器没做任何处理,我们稍安勿躁。
接下来就是模型中的配置,由于我们想在领导指派了开会人员后进行监听,所以需要如下设置

其中 Event 代表事件触发类型,作用如其名
Class 代表监听器全路径,此处为 
com.kenary.activiti.listener.MyExecutionListener,则是之前创建的 MyExecutionListener
监听器配置完成后领导发起开会流程就配置完成了!

【开会人员签到】
相对于【领导发起开会】流程,【开发人员签到】流程则需要配置更多东西

其中,集合(Collection) 设置的是存储开会人员集合的变量名,注意:此处不需要${},并且 变量的值必须是 Collection的子类,即List、Set等

多实例类型 设置的是 并行、串行 等方式

  并行代表同时进行,如把任务分给5个人来处理,这5个人同时会收到任务,并且可以同时处理,不受各自的影响。

  串行代表工作或任务由一个人完成后,再由另一个人去处理,直至全部完成,每个任务依赖于前一个任务完成。

元素变量(Element variable) 设置的是集合(Collection)每遍历一次设置的变量值的变量名,即迭代集合时存储集合里面单个元素的变量名,集合遍历时会根据内容创建任务

代理 设置的是处理该任务的用户,由于集合每遍历一次就创建了一个任务,所以这里和领导发起开会流程无太大差异,指定代理人即可,不过代理人员需要使用元素变量(Element variable)(Item 迭代的值)

至此,流程配置基本完成

3. 部署流程

import org.activiti.engine.RepositoryService;import org.activiti.engine.repository.Deployment;

......

private RepositoryService repositoryService;
......

Deployment deployment = repositoryService.createDeployment().name(modelData.getName()).addString(processName, new String(bpmnBytes, "UTF-8")).deploy();modelData.setDeploymentId("99999");repositoryService.saveModel(modelData);

其中,99999 为模型id

4. 领导发起开会

import org.activiti.engine.RuntimeService;.......
@Autowiredprivate RuntimeService runtimeService;
......

// 开始-》开启领导发起开会流程(指定领导)
Map<String,Object> p1 = new HashMap<>();
p1.put("leader","jjh");
runtimeService.startProcessInstanceByKey("10001",map);

其中,"jjh" 为设置的变量值,因为我内部通过用户名来区分,所以直接设置 jjh

 runtimeService.startProcessInstanceByKey("10001",map);   为启动流程,10001 为流程id

当这步执行完成后,我们来查询 属于 jjh 的任务

5. 开会人员签到
开会人员签到需要设置多个用户

import org.activiti.engine.TaskService;

.......
@Autowiredprivate TaskService taskService;.......

Map<String,Object> map = new HashMap<>();
map.put("assigneeList","jjh,yxc");
// 完成任务
teskService.complete("75167", map);

可以看见,我们的用户设置了多个,并且使用逗号隔开,但是刚才也介绍了 集合(Colloection) 必须是 Collection的子类,也就是 List、Set等,而String不是

所以此时可以回到监听器,并将其改为:

public class MyExecutionListener implements ExecutionListener {@Overridepublic void notify(DelegateExecution delegateExecution) throws Exception {String assigneeList = String.valueOf(delegateExecution.getVariable("assigneeList"));if(assigneeList != null){// 根据逗号分割并以数组形式重新设置进去delegateExecution.setVariable("assigneeList", Arrays.asList(assigneeList.split(",")));}}
}

作用是将变量中的字符串根据逗号分割成了集合,其实此步骤完全多余,在设置变量时直接设置集合即可,但是为了顺带加上监听器的作用,所以则以此种方式说明

6. 效果预览

当任务执行后,我们分别看看 jjh 和 yxc 双用户的任务

可以看到,两个不同的用户的任务id是不相同的,所以他们不会互不干扰,Activiti动态多实例完成。

转载于:https://www.cnblogs.com/adversary/p/9854707.html

Activiti 用户任务并行动态多实例(多用户执行流程)相关推荐

  1. Python中的If嵌套讲解(语法、实例、执行流程)

    If就是if条件语句,嵌套的意思可以理解为在生活当中有种玩具叫做俄罗斯套娃,这个套娃呢就是大的套娃里面有小的娃,小娃里面有更小的娃,就这样一层一层的套下去.在编程语言当中,if嵌套指代的意思是一个大的 ...

  2. CGLIB动态代理对象执行流程分析

    前言 都说CGLIB动态代理对象执行方法的速度相较于JDK动态代理更快,那么为什么更快,实际是因为CGLIB中采用了FastClass机制,本篇文章将对CGLIB动态代理对象执行某一个方法的流程进行分 ...

  3. flowable学习笔记(四):动态多实例

    1.定义流程模板 [测试用户任务多实例]任务节点配置了以下属性: 集合(多实例):userList.这个创建流程实例时入参需要加上这个参数. 元素变量(多实例):user.工作流创建多实例时会将集合( ...

  4. Activiti工作流--并行网关--之九

    流程的业务描述 会议记录会签 并行网关是不需要设置流程变量的,并行网关不在流程变量的范围内 比如: 在开完某个产品设计会以后,需要对会议约定一些事项进行签字画押涉及到两个部门(产品部/研发部)的主管和 ...

  5. 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 创建 事件监听器 对应的 动态代理 | 动态代理的数据准备 | 创建调用处理程序 | 创建动态代理实例对象 )

    文章目录 前言 一.创建 事件监听器 对应的 动态代理 二.动态代理 数据准备 三.动态代理 调用处理程序 四.动态代理 实例对象创建 前言 Android 依赖注入的核心就是通过反射获取 类 / 方 ...

  6. 动态执行流程分析和性能瓶颈分析的利器——gperftools的Cpu Profiler

    在<动态执行流程分析和性能瓶颈分析的利器--valgrind的callgrind>中,我们领略了valgrind对流程和性能瓶颈分析的强大能力.本文将介绍拥有相似能力的gperftools ...

  7. 动态执行流程分析和性能瓶颈分析的利器——valgrind的callgrind

    在<内存.性能问题分析的利器--valgrind>一文中我们简单介绍了下valgrind工具集,本文将使用callgrind工具进行动态执行流程分析和性能瓶颈分析.(转载请指明出于brea ...

  8. 网站性能分析(下)-让网站并行加载但顺序执行JS

    如果网站不支持JavaScript,复杂的功能将无法正常工作.在开发当中通常有几个脚本会写在HTML文件的头部.你嵌入的越多,网站的速度潜在的变得越慢.因此提高并行加载速度变得非常有必要,在前面的文章 ...

  9. 查询优化器内核剖析第四篇:从一个实例看执行计划

    查询优化器内核剖析第四篇:从一个实例看执行计划 系列文章索引: 查询优化器内核剖析第一篇 查询优化器内核剖析第二篇:产生候选执行计划&执行计划成本估算 查询优化器内核剖析第三篇:查询的执行与计 ...

最新文章

  1. PTA混淆总结(就做个笔记储存一下)
  2. 用二项逻辑斯蒂回归解决二分类问题
  3. optee的Offline Signing of TAs方案
  4. Windows右键在当前目录打开Cygwin终端
  5. SpringCloud微服务架构,Spring Cloud 服务治理(Eureka,Consul,Nacos),Ribbon 客户端负载均衡,RestTemplate与OpenFeign实现远程调用
  6. python 投票计数器全班50人3个候选人_Python程序为STV投票系统,为每个人加上所有的第一偏好票...
  7. 信息安全学习笔记--CSRF
  8. 拼团功能实现 php_PHP实现微信退款功能
  9. 关于C#从一个List复制到另一个List的简便写法。
  10. 【逆向】修改软件标题(基于PE Explorer)
  11. 基于python的证件照_利用python自动生成证件照
  12. 数据分析学习总结笔记06:T检验的原理和步骤
  13. 软件版本的GA 代表什么意思?
  14. 结对编程——自动生成数学试卷的系统(javaswing,mysql)by 陈松刘宇航
  15. 计算机计时器原理,定时器和计数器-微机原理与接口技术.DOC
  16. 《Linux运维总结:find命令高级用法详解》
  17. php win8 下载64位下载,WIN8.1x64纯净专业版GHO系统下载20180713
  18. python数据类型(一)
  19. Python之数据采集与文档读取练习
  20. dnf服务器维护11.12,【原来DNF这么多BUG】 12月11日版本维护后其他内容修改

热门文章

  1. 直接说,我要怎样才能做到年薪 50 万?
  2. 在大厂工作5年的大神,给前端初学者的四大建议,收藏咯
  3. python批量读取csv并入库pg_如何通读CSV然后在Python中发布批量API调用
  4. php 调用图,php 缩略图类(附调用示例)
  5. 谷歌大神Jeff Dean领衔,万字展望5大AI趋势
  6. java中线程总结_java中多线程学习笔记总结
  7. STM8学习笔记---寄存器操作之位或和位与运算
  8. 西瓜书《贝叶斯》朴素贝叶斯公式推导
  9. 基于softmax的文本多分类模型代码实现
  10. 代码评审-如何保证缓存与数据库的读写一致性?