对于复杂的流程可能会有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相关推荐

  1. matlab拼接tiff文件_ImageJ实用技巧——自动图片拼接(基本功能篇)

    通常在拍摄大型的,例如脑片.免疫组化等样本时,会遇到显微镜视野太小,需要多次拍摄的情况. 为了解决显微镜视野太小的问题,一般会使用电动平移台移动样品,对整个样品进行平铺扫描.然而由于精确性的原因,往往 ...

  2. vue一二级联动清空二级数据_【周一实用技巧】二级联动还不够,自动更新才最牛。Excel 2013利用数据验证条件制作一级、二级联动和自动更新下拉列表...

    Excel 2013实用技巧教程系列 第-9.4-节  下拉列表 下拉列表作为提高数据录入效率和防止错误数据的有效方法,在日常工作中应用非常普遍.除了一级.二级联动列表,小编excel小课堂(ID:e ...

  3. linux让新生成的文件自动加锁,Linux_实用技巧一则 Linux系统对文件进行加锁,当有多个工作线程要同时对一 - phpStudy...

    实用技巧一则 Linux系统对文件进行加锁 当有多个工作线程要同时对一个文件进行写操作时,如果不对该文件进行加锁就可能会因误操作而引起一系列的问题. 解决这个问题有多种方法.我们这里考虑使用文件锁来对 ...

  4. 【源码】reportgen:Matlab自动生成WORD/PPT的实用技巧

    reportgen 本文将介绍Matlab的一个实用技巧.一键生成Word版本的报告.Matlab之前都是通过调用COM接口来实现的,类似于VBA,虽然可做的事情很多,但并不适合一般的童鞋. 自动化报 ...

  5. Android Gradle实用技巧/如何自动为APK瘦身

    <Android Gradle 权威指南>终于发售上市了,这本书里包含了很多实用技巧.实战经验以及原理分析,今天这篇文章主要介绍下如何自动为APK瘦身的. 随着工程越来越大,功能越来越多, ...

  6. Windows2003实用技巧

    Windows2003实用技巧七则 一.跳过磁盘检修等待时间 一旦计算机因意外原因,例如突然停电或者死机的话,那么计算机下次重新启动的话,系统就会花10秒钟左右的时间,来运行磁盘扫描程序,检查磁盘是否 ...

  7. Vim 实用技术,第 1 部分: 实用技巧

    0. Vim 简介 作为开源世界最重要的编辑器之一(另一个是 Emacs),Vim 以其强大的功能和可定制能力被众多开发者所喜爱.不过,也许就是因为 Vim 的功能太强大了,要真正用好 Vim 并不容 ...

  8. 电脑操作实用技巧60招(转)

    电脑操作实用技巧60招 1.如果同时有多个窗口打开,想要关闭的话,可以按住shift不放然后点击窗口右上角的关闭图标. 2.在保存网页前,可以按一下'ESC'键(或脱机工作)再保存,这样保存很快. 3 ...

  9. vim实用技巧(第二版)........持续更新ing

    全书共123个技巧,每天更新两个,计划两个月更新完. (目前更新完技巧39) vim实用技巧第二版全部教学内容 前言 第1章 Vim解决问题的方式  技巧1 认识 . 命令  技巧2 不要自我重复   ...

最新文章

  1. C# 中的委托和事件(1)
  2. 【原】Java学习笔记028 - 集合
  3. 【C language】C语言二分法查找
  4. 第二章 创建webGL设备和绘制缓冲区呈现 Context Creation and Drawing Buffer Presentation
  5. html 打开页面光标自动选中输入框_初识selenium之web自动化
  6. Match Points
  7. 《鸿蒙理论知识05》HarmonyOS概述之下载与安装软件
  8. 巧用枚举CommandBehavior关闭SqlDataReader联接数据库时的conn.open状态
  9. LeetCode题 - 26 删除排序数组中的重复项 python实现
  10. Object.definePropety
  11. 8、RabbitMQ-消息的确认机制(生产者)
  12. 树莓派控制舵机和步进电机
  13. 谷歌gmail注册入口_如何阻止Gmail将事件添加到Google日历
  14. 国外电子与通信教材系列最新目录单
  15. js-array数组-slice-splice
  16. 【内网安全】——Windows提权姿势
  17. 使用visjs制作网络拓扑图
  18. UE4--材质地形篇——地形材质的运用(混合材质)
  19. 计组高分笔记:【04】指令系统 「指令格式与分类 | CISC、RISC | 直接寻址 | 间接寻址 | 寄存器寻址 | 隐式寻址 | 立即寻址| 基址寻址 | 变址寻址 | 相对寻址 | 堆栈寻址」
  20. HtmlUnit使用体会

热门文章

  1. 马斯克为啥要成立SpaceX
  2. 白嫖freenom免费顶级域名
  3. 1365:FBI树(fbi)
  4. 并发编程 定时线程池ScheduledThreadPoolExecutor学习总结
  5. 菜鸟的layui学习总结
  6. CERN再次证明中微子可以超光速
  7. UE4 (旧版4.15-4.24)安卓打包报错license not accepted
  8. Element属性 :获取,设置元素滚动距离,scrollHeight,scrollTop, scrollLeft属性详解
  9. matlab如何打开flt文件,FIT文件格式解析及MATLAB读取程序
  10. Nature调查 | 85%硕博生存在财务危机,近一半或因此放弃学业