Flowable实用技巧-自动完成首个UserTask
对于复杂的流程可能会有BUG,欢迎指出~
org.flowable.engine.common.api.delegate.event.FlowableEventListener是Flowable的全局监听
public interface FlowableEventListener {void onEvent(FlowableEvent event);
}
其下的实现类有:
核心接口void onEvent(FlowableEvent event);
经过onEvent的事件有多个,目前要达到自动完成首个任务的主要思路是event到任务实体,也就是TaskEntity,再通过TaskService.complete完成TaskEntity任务即可,TaskEntity的基类就是
FlowableEntityEventImpl
public class FlowableEntityEventImpl extends FlowableEventImpl implements FlowableEngineEntityEvent {protected Object entity;public FlowableEntityEventImpl(Object entity, FlowableEngineEventType type) {super(type);if (entity == null) {throw new FlowableIllegalArgumentException("Entity cannot be null.");}this.entity = entity;}@Overridepublic Object getEntity() {return entity;}
}
完整代码如下
/*** 全局自动完成首个任务监听器* Created by Vim 2018/11/21 9:46** @author Vim*/
public class AutoCompleteFirstTaskListener implements FlowableEventListener {@Overridepublic void onEvent(FlowableEvent event) {if (!(event instanceof FlowableEntityEventImpl)) {return;}FlowableEntityEventImpl entityEvent = (FlowableEntityEventImpl) event;Object entity = entityEvent.getEntity();//是否是任务实体类if (!(entity instanceof TaskEntity)) {return;}TaskEntity taskEntity = (TaskEntity) entity;//是否是在任务节点创建时if (FlowableEngineEventType.TASK_CREATED.equals(event.getType())) {//找到流程第一个userTask节点FlowElement firstElement = this.findFirstFlowElement(taskEntity);//对比节点是否相同,因为有可能有子流程的节点进来if (firstElement != null && taskEntity.getTaskDefinitionKey().equals(firstElement.getId())) {Context.getProcessEngineConfiguration().getTaskService().complete(taskEntity.getId());}}}/*** 查找流程第一个userTask*/private FlowElement findFirstFlowElement(TaskEntity taskEntity) {RepositoryService repositoryService = SpringContextListener.getBean(RepositoryService.class);BpmnModel bpmnModel = repositoryService.getBpmnModel(taskEntity.getProcessDefinitionId());for (FlowElement flowElement : bpmnModel.getProcesses().get(0).getFlowElements()) {if (flowElement instanceof StartEvent) {return bpmnModel.getFlowElement(((StartEvent) flowElement).getOutgoingFlows().get(0).getTargetRef());}}return null;}@Overridepublic boolean isFailOnException() {return false;}@Overridepublic boolean isFireOnTransactionLifecycleEvent() {return false;}@Overridepublic String getOnTransaction() {return null;}
}
监听类写好后在配置文件里配置好,我这里是springboot,配置如下:
Flowable实用技巧-自动完成首个UserTask相关推荐
- matlab拼接tiff文件_ImageJ实用技巧——自动图片拼接(基本功能篇)
通常在拍摄大型的,例如脑片.免疫组化等样本时,会遇到显微镜视野太小,需要多次拍摄的情况. 为了解决显微镜视野太小的问题,一般会使用电动平移台移动样品,对整个样品进行平铺扫描.然而由于精确性的原因,往往 ...
- vue一二级联动清空二级数据_【周一实用技巧】二级联动还不够,自动更新才最牛。Excel 2013利用数据验证条件制作一级、二级联动和自动更新下拉列表...
Excel 2013实用技巧教程系列 第-9.4-节 下拉列表 下拉列表作为提高数据录入效率和防止错误数据的有效方法,在日常工作中应用非常普遍.除了一级.二级联动列表,小编excel小课堂(ID:e ...
- linux让新生成的文件自动加锁,Linux_实用技巧一则 Linux系统对文件进行加锁,当有多个工作线程要同时对一 - phpStudy...
实用技巧一则 Linux系统对文件进行加锁 当有多个工作线程要同时对一个文件进行写操作时,如果不对该文件进行加锁就可能会因误操作而引起一系列的问题. 解决这个问题有多种方法.我们这里考虑使用文件锁来对 ...
- 【源码】reportgen:Matlab自动生成WORD/PPT的实用技巧
reportgen 本文将介绍Matlab的一个实用技巧.一键生成Word版本的报告.Matlab之前都是通过调用COM接口来实现的,类似于VBA,虽然可做的事情很多,但并不适合一般的童鞋. 自动化报 ...
- Android Gradle实用技巧/如何自动为APK瘦身
<Android Gradle 权威指南>终于发售上市了,这本书里包含了很多实用技巧.实战经验以及原理分析,今天这篇文章主要介绍下如何自动为APK瘦身的. 随着工程越来越大,功能越来越多, ...
- Windows2003实用技巧
Windows2003实用技巧七则 一.跳过磁盘检修等待时间 一旦计算机因意外原因,例如突然停电或者死机的话,那么计算机下次重新启动的话,系统就会花10秒钟左右的时间,来运行磁盘扫描程序,检查磁盘是否 ...
- Vim 实用技术,第 1 部分: 实用技巧
0. Vim 简介 作为开源世界最重要的编辑器之一(另一个是 Emacs),Vim 以其强大的功能和可定制能力被众多开发者所喜爱.不过,也许就是因为 Vim 的功能太强大了,要真正用好 Vim 并不容 ...
- 电脑操作实用技巧60招(转)
电脑操作实用技巧60招 1.如果同时有多个窗口打开,想要关闭的话,可以按住shift不放然后点击窗口右上角的关闭图标. 2.在保存网页前,可以按一下'ESC'键(或脱机工作)再保存,这样保存很快. 3 ...
- vim实用技巧(第二版)........持续更新ing
全书共123个技巧,每天更新两个,计划两个月更新完. (目前更新完技巧39) vim实用技巧第二版全部教学内容 前言 第1章 Vim解决问题的方式 技巧1 认识 . 命令 技巧2 不要自我重复 ...
最新文章
- C# 中的委托和事件(1)
- 【原】Java学习笔记028 - 集合
- 【C language】C语言二分法查找
- 第二章 创建webGL设备和绘制缓冲区呈现 Context Creation and Drawing Buffer Presentation
- html 打开页面光标自动选中输入框_初识selenium之web自动化
- Match Points
- 《鸿蒙理论知识05》HarmonyOS概述之下载与安装软件
- 巧用枚举CommandBehavior关闭SqlDataReader联接数据库时的conn.open状态
- LeetCode题 - 26 删除排序数组中的重复项 python实现
- Object.definePropety
- 8、RabbitMQ-消息的确认机制(生产者)
- 树莓派控制舵机和步进电机
- 谷歌gmail注册入口_如何阻止Gmail将事件添加到Google日历
- 国外电子与通信教材系列最新目录单
- js-array数组-slice-splice
- 【内网安全】——Windows提权姿势
- 使用visjs制作网络拓扑图
- UE4--材质地形篇——地形材质的运用(混合材质)
- 计组高分笔记:【04】指令系统 「指令格式与分类 | CISC、RISC | 直接寻址 | 间接寻址 | 寄存器寻址 | 隐式寻址 | 立即寻址| 基址寻址 | 变址寻址 | 相对寻址 | 堆栈寻址」
- HtmlUnit使用体会
热门文章
- 马斯克为啥要成立SpaceX
- 白嫖freenom免费顶级域名
- 1365:FBI树(fbi)
- 并发编程 定时线程池ScheduledThreadPoolExecutor学习总结
- 菜鸟的layui学习总结
- CERN再次证明中微子可以超光速
- UE4 (旧版4.15-4.24)安卓打包报错license not accepted
- Element属性 :获取,设置元素滚动距离,scrollHeight,scrollTop, scrollLeft属性详解
- matlab如何打开flt文件,FIT文件格式解析及MATLAB读取程序
- Nature调查 | 85%硕博生存在财务危机,近一半或因此放弃学业