Activiti7流程结束监听事件中,抛出的异常无法被spring全局异常捕捉
ProcessRuntimeEventListener
activiti7中,提供了ProcessRuntimeEventListener
监听器,用于监听流程实例的结束事件
/*** 流程完成监听器*/
@Slf4j
@Component
public class ProcessCompleteListener implements ProcessRuntimeEventListener<ProcessCompletedEvent> {@Overridepublic void onEvent(ProcessCompletedEvent event) {// ...处理自己的业务逻辑// 这里写一段抛出异常的测试代码int a = 1 / 0;}
}
上述代码中,由于1/0会抛出运行时异常,理论上来说应该被我们的全局异常所捕获
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {/*** 通用未知异常*/@ExceptionHandler(Throwable.class)@ResponseStatus(HttpStatus.OK)public ResultEntity<?> error(Exception e) {return ResultEntity.fail(ResultEnum.SERVER_ERROR, "系统错误,请联系管理员!");}}
实际情况是无法捕获
解决思路
既然异常没有被一层一层的抛出去直到被全局异常捕获,那说明调用ProcessCompleteListener.onEvent()
的某个地方使用try catch
将异常捕获了该异常并没有继续向上抛出,随着这个思路,我们将断点打在1/0这行代码上面
然后重新运行代码,让代码执行到断点位置
然后再左侧的方法调用栈中,一个一个找,是哪个地方调用了onEvent并且进行了try catch异常捕捉
(上图只是我执行的测试代码,用于截图出这个方法调用栈的图片)
找到使用了try catch的实际的调用处,如图所示
catch中通过判断listener的isFailOnException()来控制是否抛出异常
由断点可以看出,listener对象是ProcessCompletedListenerDelegate
,由于是事后写的文章,所以断点截图没有截出来
我们可以创建一个CustomProcessCompletedListenerDelegate
自定义子类继承该类,然后重新isFailOnException方法,但是问题是如何将spring环境中的ProcessCompletedListenerDelegate
替换成我们的自定义子类,继续ProcessCompletedListenerDelegate
类是什么时候创建出来的,有2个办法
- 给
ProcessCompletedListenerDelegate
类的构造器上面打断点(小提示:如果遇到想给构造器打断点,但是没有写构造器的情况下,就在类名所在行打断点),然后重启项目,等执行到断点行的时候,再次查看方法调用栈,找到什么时候创建的该类 - 直接alt + F7,或者右键类名点
Find Usages
查找使用地方
取巧一点的方法是先用方式2,看看使用的地方多不多,如果很多无法确定具体使用的地方,那么在用方法1
这里可以直接使用方法2,找到调用处
ProcessRunTimeAutoConfiguration的369行在使用,直接点进去
这就好办了,看到@ConditionOnMissingBean
,我们直接自己注入CustomProcessCompletedListenerDelegate
到Spring中来管理就可以
自定义监听器委托类CustomProcessCompletedListenerDelegate
/*** 继承ProcessCompletedListenerDelegate,重写isFailOnException以达目的*/
public class CustomProcessCompletedListenerDelegate extends ProcessCompletedListenerDelegate {public CustomProcessCompletedListenerDelegate(List<ProcessRuntimeEventListener<ProcessCompletedEvent>> processRuntimeEventListeners, ToProcessCompletedConverter processCompletedConverter) {super(processRuntimeEventListeners, processCompletedConverter);}@Overridepublic boolean isFailOnException() {return true;}
}
注入Spring,我这里使用的是SpringBoot
@Configuration
// 如果是spi方式注入,则添加如下这行控制顺序
// @AutoConfigureBefore(ProcessRuntimeAutoConfiguration.class)
public class ProcessCompleteListenerConfig {@Bean("registerProcessCompletedListenerDelegate")public InitializingBean registerProcessCompletedListenerDelegate(RuntimeService runtimeService,@Autowired(required = false) List<ProcessRuntimeEventListener<ProcessCompletedEvent>> eventListeners,ToProcessCompletedConverter converter) {return () -> runtimeService.addEventListener(new CustomProcessCompletedListenerDelegate(getInitializedListeners(eventListeners),converter),ActivitiEventType.PROCESS_COMPLETED);}private <T> List<T> getInitializedListeners(List<T> eventListeners) {return eventListeners != null ? eventListeners : Collections.emptyList();}}
相关文章:

Activiti7流程结束监听事件中,抛出的异常无法被spring全局异常捕捉
ProcessRuntimeEventListener activiti7中,提供了ProcessRuntimeEventListener监听器,用于监听流程实例的结束事件 /*** 流程完成监听器*/ Slf4j Component public class ProcessCompleteListener implements ProcessRuntimeEventListener<ProcessC…...
Android 默认关闭自动旋转屏幕功能
Android 默认关闭自动旋转屏幕功能 接到客户邮件想要默认关闭设备的自动旋转屏幕功能,具体修改参照如下: /vendor/mediatek/proprietary/packages/apps/SettingsProvider/res/values/defaults.xml - <bool name"def_accelerometer_rotati…...

软文推广方案,媒介盒子分享
作为企业宣传的手段,它能用较低的成本获得较好的宣传效果,但有许多企业在进行软文推广时并不起效,这是因为没掌握好方法。今天媒介盒子就来告诉大家,通用的软文推广方案。 一、 明确推广目标以及受众 明确软文推广的目标有助于明…...

CSDN热榜分析6:将实时爬取的热榜数据导入sqlite
文章目录 初始化数据库接口更改数据库写入 初始化数据库 引入数据库的目的不止是为了存储,更多地也是为了便于查询,否则也没必要用一个Text控件来展示信息了。 所以一个正常的工作逻辑是,一打开热榜分析系统,也就同步打开数据库…...

2023年11月1日,Google全新域名来袭:.ing域名现已问世!
2023年11月1日(Oct31,2023美国与中国时差)Google宣布,正式推出.ing域名,这是一种新的顶级域名,旨在为用户提供更多的选择和创意。.ing域名是由Google和国际互联网名称与数字地址分配机构(ICANN)合作开发的,…...

【设计模式】第22节:行为型模式之“状态模式”
一、简介 状态模式一般用来实现状态机,而状态机常用在游戏、工作流引擎等系统开发中。不过,状态机的实现方式有多种,除了状态模式,比较常用的还有分支逻辑法和查表法。该模式允许对象内部状态改变使改变它的行为。 二、适用场景…...
JavaSE21——ArrayList
集合框架 ArrayList 一、概述 ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。 ArrayList 继承了 AbstractList ,并实现了 List 接口。 ArrayList中的元素可以通过索引访问…...
找质数(枚举 埃氏筛 线性筛)
输入一个数,返回小于等于这个数的质数。 枚举法: public static int countPrimes(int n) {int cnt0;for(int i2;i<n;i) {if(prime(i))cnt;}return cnt;}private static boolean prime(int x) {for(int i2;i*i<x;i){if(x%i0)return false;}return …...
第十二章 ObjectScript 系统标志和限定符 (qspec) - 标志
文章目录 第十二章 ObjectScript 系统标志和限定符 (qspec) - 标志 示例取消Negation标志Flags 第十二章 ObjectScript 系统标志和限定符 (qspec) - 标志 类库中的许多方法都接受 qspec 参数,通过该参数,可以控制将外部源导入 IRIS、控制代码的编译方式以…...

解决Windows Server 2012 由于没有远程桌面授权服务器可以提供需求可证
刚开始提示 之后就登录不了 (如下图提示) 由于windows server 2012 R2 安装了 远程桌面角色,但是这个角色是120天免费的,需要购买授权的。解决方法是取消/删除这个角色,就可以恢复正常的远程 一直下一步 远程桌面服…...

上位机底部栏 UI如何设置
上位机如果像设置个多页面切换: 位置: 代码如下: "tabBar": {"color": "black","selectedColor": "#d43c33","borderStyle":"black","backgroundColor": …...

MySQL表的增删改查(基础)
文章目录 一、CRUD二、新增(Create)2.1 单行数据全列插入2.2多行数据指定列插入 三、查询3.1 全列查询3.2 指定列查询3.3 查询字段表达式3.4 别名3.5 去重 DISTINCT3.6 排序3.7 条件查询 WHERE3.8 分页查询 LIMIT 四、修改(Update)…...
uniapp书写顶部选项卡代码详细例子
以下是一个基于uni-app框架,使用顶部选项卡的代码示例。 在页面的.vue文件中,添加一个uni-tab-bar组件,并在组件内部添加多个uni-tab-bar-item组件,来实现顶部选项卡的布局。 <template><view><uni-tab-bar :cur…...

注册中心ZK、nameServer、eureka、Nacos介绍与对比
前言 注册中心的由来 微服务架构是存在着很多跨服务调用,每个服务都存在着多个节点,如果有多个提供者和消费者,当提供者增加/减少或者消费者增加/减少,双方都需要感知发现。所以诞生了注册中心这个中间件。 市面上有很多注册中心,如 Zookeeper、NameServer、Eureka、Na…...
杂志详情。
<!DOCTYPE html> <html><head><title>杂志详情</title><meta http-equiv"content-type" content"text/html; charsetutf-8"/><meta name"apple-mobile-web-app-capable" content"yes"/><…...

前端知识与基础应用#2
标签的分类 关于标签我们可以分为 : 单标签:img, br hr 双标签:a,h,div 按照属性可分为: 块儿标签(自己独自占一行):h1-h6, p,div 行内(内联)标签(…...

【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割6(数据预处理)
由于之前哔站作者整理的LUNA16数据处理方式过于的繁琐,于是,本文就对LUNA16数据做一个新的整理,最终得到的数据和形式是差不多的。但是,主要不同的是代码逻辑比较的简单,便于理解。 对于数据集的学习,可以…...

硬件加速器及其深度神经网络模型的性能指标理解
前言: 现如今,深度神经网络模型和硬件加速器,如GPU、TPU等的关系可谓是“不分彼此”,随着模型参数的增加,硬件加速器成为了训练、推理深度神经网络不可或缺的一个工具,而近年来硬件加速器的发展也得益于加速…...

嵌入式每日500(4)231104 (Flash类型定义、Flash常量定义、Flash函数)
文章目录 1.Flash类型定义(两个结构体)2.Flash常量定义(3种)3.Flash函数(31个,FLASH分为两个区,一个是普通的存储空间,一个是选项字节OB,函数名里带OB的就是对选项字节空…...

21款奔驰GLC300L升级23P驾驶辅助 出行更加的安全
驾驶辅助和自动驾驶的区别就是需要人为去接管,虽然车辆会根据道路自己行驶,弯道上也能居中自动修正行驶,长时间不接管方向盘,系统会提示人为接管,这就是奔驰的23P驾驶辅助系统, 很多车友升级23P驾驶辅助系…...
PDF文件转换之输出指定页到新的 PDF 文件
背景 一份 PDF 学习资料需要打印其中某几页,文件有几百兆,看到 WPS 有PDF拆分功能,但是需要会员,开了一个月会员后完成了转换。突然想到,会员到期后如果还要拆解的话,怎么办呢?PDF 文件拆解功能…...
Webhook入门
主要参考资料: 深入解析 Webhook:从原理到实践的全面指南: https://blog.csdn.net/weixin_43114209/article/details/144250750 目录 简介Webhook 与传统 API 调用的区别与轮询 (Polling) 的对比典型工作流程 简介 简单来说,Webhook 是一种“…...

投稿 IEEE Transactions on Knowledge and Data Engineering 注意事项
投稿 IEEE Transactions on Knowledge and Data Engineering 注意事项 要IEEE overleaf 模板私信,我直接给我自己论文,便于编辑 已经投稿完成了,有一些小坑 准备工作 注册IEEE账户:若没有IEEE账户,需前往IEEE官网注册。注册成功后,可用于登录投稿系统。现在新的系统,…...
React整合【ECharts】教程004:饼图的构建和基本设置
文章目录 6、饼图6.1 开启圆角环形6.2 设置扇区间隙6.3 开启深色模式6.4 开启南丁格尔玫瑰图6.5 修改数据重绘饼图6.6 完整代码下载6、饼图 6.1 开启圆角环形 1️⃣添加圆角环形开关: <div style={{marginTop:10px}}>圆角环形:<Switch checkedChildren="开启…...

Escrcpy(安卓手机投屏软件) v1.29.6 中文绿色版
在数字设备日益普及的今天,用户对于设备的控制和管理需求也在不断增加。对于Android设备用户来说,Escrcpy这款强大的工具无疑是一个福音。它不仅提供了直观的图形化界面,让用户能够轻松显示和控制自己的Android设备,还以完全免费开…...
鸿蒙OSUniApp 制作倒计时与提醒功能#三方框架 #Uniapp
使用 UniApp 制作倒计时与提醒功能 前言 倒计时与提醒功能在移动应用中应用广泛,如活动秒杀、任务提醒、考试倒计时等。一个实用的倒计时组件不仅要精准计时,还要兼容多端,尤其是在鸿蒙(HarmonyOS)等新兴平台上保证流…...

【JVM】初识JVM 从字节码文件到类的生命周期
初识JVM JVM(Java Virtual Machine)即 Java 虚拟机,是 Java 技术的核心组件之一。JVM的本质就是运行在计算机上的一个程序,通过软件模拟实现了一台抽象的计算机的功能。JVM是Java程序的运行环境,负责加载字节码文件&a…...

【Python办公】Excel简易透视办公小工具
目录 专栏导读1. 背景介绍2. 功能介绍3. 库的安装4. 界面展示5. 使用方法6. 实际应用场景7. 优化方向完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系…...
xcode卡死问题,无论打开什么程序xcode总是在转菊花,重启电脑,卸载重装都不行
很可能是因为我们上次没有正常关闭Xcode,而Xcode保留了上次错误的一些记录,而这次打开Xcode依然去加载错误的记录,所以必须完全删除这些记录Xcode才能加载正常的项目。 那么也就是说,我们是不是只需要删除这部分错误记录文件就可以…...

Windows下安装并使用kubectl查看K8S日志
【1】安装kubectl 官网文档:https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-windows/ 下载后得到 kubectl.exe,放到一个目录下,然后配置环境变量。 此时CMD 进入DOS命令窗口 kubectl version【2】配置config文件 其实就是…...