Activiti 用户任务并行动态多实例(多用户执行流程)
在很多情况下,我们需要多用户共同执行余下流程,比如开会流程:
- 领导发起开会,选择开会人员(多个)
- 每个开会人员接收到通知后需要签到(一名用户签到不会影响到另一位用户的签到)
- 签到完成后则流程结束
如果只使用代理(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 用户任务并行动态多实例(多用户执行流程)相关推荐
- Python中的If嵌套讲解(语法、实例、执行流程)
If就是if条件语句,嵌套的意思可以理解为在生活当中有种玩具叫做俄罗斯套娃,这个套娃呢就是大的套娃里面有小的娃,小娃里面有更小的娃,就这样一层一层的套下去.在编程语言当中,if嵌套指代的意思是一个大的 ...
- CGLIB动态代理对象执行流程分析
前言 都说CGLIB动态代理对象执行方法的速度相较于JDK动态代理更快,那么为什么更快,实际是因为CGLIB中采用了FastClass机制,本篇文章将对CGLIB动态代理对象执行某一个方法的流程进行分 ...
- flowable学习笔记(四):动态多实例
1.定义流程模板 [测试用户任务多实例]任务节点配置了以下属性: 集合(多实例):userList.这个创建流程实例时入参需要加上这个参数. 元素变量(多实例):user.工作流创建多实例时会将集合( ...
- Activiti工作流--并行网关--之九
流程的业务描述 会议记录会签 并行网关是不需要设置流程变量的,并行网关不在流程变量的范围内 比如: 在开完某个产品设计会以后,需要对会议约定一些事项进行签字画押涉及到两个部门(产品部/研发部)的主管和 ...
- 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 创建 事件监听器 对应的 动态代理 | 动态代理的数据准备 | 创建调用处理程序 | 创建动态代理实例对象 )
文章目录 前言 一.创建 事件监听器 对应的 动态代理 二.动态代理 数据准备 三.动态代理 调用处理程序 四.动态代理 实例对象创建 前言 Android 依赖注入的核心就是通过反射获取 类 / 方 ...
- 动态执行流程分析和性能瓶颈分析的利器——gperftools的Cpu Profiler
在<动态执行流程分析和性能瓶颈分析的利器--valgrind的callgrind>中,我们领略了valgrind对流程和性能瓶颈分析的强大能力.本文将介绍拥有相似能力的gperftools ...
- 动态执行流程分析和性能瓶颈分析的利器——valgrind的callgrind
在<内存.性能问题分析的利器--valgrind>一文中我们简单介绍了下valgrind工具集,本文将使用callgrind工具进行动态执行流程分析和性能瓶颈分析.(转载请指明出于brea ...
- 网站性能分析(下)-让网站并行加载但顺序执行JS
如果网站不支持JavaScript,复杂的功能将无法正常工作.在开发当中通常有几个脚本会写在HTML文件的头部.你嵌入的越多,网站的速度潜在的变得越慢.因此提高并行加载速度变得非常有必要,在前面的文章 ...
- 查询优化器内核剖析第四篇:从一个实例看执行计划
查询优化器内核剖析第四篇:从一个实例看执行计划 系列文章索引: 查询优化器内核剖析第一篇 查询优化器内核剖析第二篇:产生候选执行计划&执行计划成本估算 查询优化器内核剖析第三篇:查询的执行与计 ...
最新文章
- PTA混淆总结(就做个笔记储存一下)
- 用二项逻辑斯蒂回归解决二分类问题
- optee的Offline Signing of TAs方案
- Windows右键在当前目录打开Cygwin终端
- SpringCloud微服务架构,Spring Cloud 服务治理(Eureka,Consul,Nacos),Ribbon 客户端负载均衡,RestTemplate与OpenFeign实现远程调用
- python 投票计数器全班50人3个候选人_Python程序为STV投票系统,为每个人加上所有的第一偏好票...
- 信息安全学习笔记--CSRF
- 拼团功能实现 php_PHP实现微信退款功能
- 关于C#从一个List复制到另一个List的简便写法。
- 【逆向】修改软件标题(基于PE Explorer)
- 基于python的证件照_利用python自动生成证件照
- 数据分析学习总结笔记06:T检验的原理和步骤
- 软件版本的GA 代表什么意思?
- 结对编程——自动生成数学试卷的系统(javaswing,mysql)by 陈松刘宇航
- 计算机计时器原理,定时器和计数器-微机原理与接口技术.DOC
- 《Linux运维总结:find命令高级用法详解》
- php win8 下载64位下载,WIN8.1x64纯净专业版GHO系统下载20180713
- python数据类型(一)
- Python之数据采集与文档读取练习
- dnf服务器维护11.12,【原来DNF这么多BUG】 12月11日版本维护后其他内容修改