当前位置: 首页 > news >正文

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个办法

  1. ProcessCompletedListenerDelegate类的构造器上面打断点(小提示:如果遇到想给构造器打断点,但是没有写构造器的情况下,就在类名所在行打断点),然后重启项目,等执行到断点行的时候,再次查看方法调用栈,找到什么时候创建的该类
  2. 直接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中&#xff0c;提供了ProcessRuntimeEventListener监听器&#xff0c;用于监听流程实例的结束事件 /*** 流程完成监听器*/ Slf4j Component public class ProcessCompleteListener implements ProcessRuntimeEventListener<ProcessC…...

Android 默认关闭自动旋转屏幕功能

Android 默认关闭自动旋转屏幕功能 接到客户邮件想要默认关闭设备的自动旋转屏幕功能&#xff0c;具体修改参照如下&#xff1a; /vendor/mediatek/proprietary/packages/apps/SettingsProvider/res/values/defaults.xml - <bool name"def_accelerometer_rotati…...

软文推广方案,媒介盒子分享

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

CSDN热榜分析6:将实时爬取的热榜数据导入sqlite

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

2023年11月1日,Google全新域名来袭:.ing域名现已问世!

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

【设计模式】第22节:行为型模式之“状态模式”

一、简介 状态模式一般用来实现状态机&#xff0c;而状态机常用在游戏、工作流引擎等系统开发中。不过&#xff0c;状态机的实现方式有多种&#xff0c;除了状态模式&#xff0c;比较常用的还有分支逻辑法和查表法。该模式允许对象内部状态改变使改变它的行为。 二、适用场景…...

JavaSE21——ArrayList

集合框架 ArrayList 一、概述 ArrayList 类是一个可以动态修改的数组&#xff0c;与普通数组的区别就是它是没有固定大小的限制&#xff0c;我们可以添加或删除元素。 ArrayList 继承了 AbstractList &#xff0c;并实现了 List 接口。 ArrayList中的元素可以通过索引访问…...

找质数(枚举 埃氏筛 线性筛)

输入一个数&#xff0c;返回小于等于这个数的质数。 枚举法&#xff1a; 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 参数&#xff0c;通过该参数&#xff0c;可以控制将外部源导入 IRIS、控制代码的编译方式以…...

解决Windows Server 2012 由于没有远程桌面授权服务器可以提供需求可证

刚开始提示 之后就登录不了 &#xff08;如下图提示&#xff09; 由于windows server 2012 R2 安装了 远程桌面角色&#xff0c;但是这个角色是120天免费的&#xff0c;需要购买授权的。解决方法是取消/删除这个角色&#xff0c;就可以恢复正常的远程 一直下一步 远程桌面服…...

上位机底部栏 UI如何设置

上位机如果像设置个多页面切换&#xff1a; 位置&#xff1a; 代码如下&#xff1a; "tabBar": {"color": "black","selectedColor": "#d43c33","borderStyle":"black","backgroundColor": …...

MySQL表的增删改查(基础)

文章目录 一、CRUD二、新增&#xff08;Create&#xff09;2.1 单行数据全列插入2.2多行数据指定列插入 三、查询3.1 全列查询3.2 指定列查询3.3 查询字段表达式3.4 别名3.5 去重 DISTINCT3.6 排序3.7 条件查询 WHERE3.8 分页查询 LIMIT 四、修改&#xff08;Update&#xff09…...

uniapp书写顶部选项卡代码详细例子

以下是一个基于uni-app框架&#xff0c;使用顶部选项卡的代码示例。 在页面的.vue文件中&#xff0c;添加一个uni-tab-bar组件&#xff0c;并在组件内部添加多个uni-tab-bar-item组件&#xff0c;来实现顶部选项卡的布局。 <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

标签的分类 关于标签我们可以分为 &#xff1a; 单标签&#xff1a;img, br hr 双标签&#xff1a;a&#xff0c;h,div 按照属性可分为&#xff1a; 块儿标签&#xff08;自己独自占一行&#xff09;&#xff1a;h1-h6, p,div 行内&#xff08;内联&#xff09;标签&#xff08…...

【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割6(数据预处理)

由于之前哔站作者整理的LUNA16数据处理方式过于的繁琐&#xff0c;于是&#xff0c;本文就对LUNA16数据做一个新的整理&#xff0c;最终得到的数据和形式是差不多的。但是&#xff0c;主要不同的是代码逻辑比较的简单&#xff0c;便于理解。 对于数据集的学习&#xff0c;可以…...

硬件加速器及其深度神经网络模型的性能指标理解

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

嵌入式每日500(4)231104 (Flash类型定义、Flash常量定义、Flash函数)

文章目录 1.Flash类型定义&#xff08;两个结构体&#xff09;2.Flash常量定义&#xff08;3种&#xff09;3.Flash函数&#xff08;31个&#xff0c;FLASH分为两个区&#xff0c;一个是普通的存储空间&#xff0c;一个是选项字节OB&#xff0c;函数名里带OB的就是对选项字节空…...

21款奔驰GLC300L升级23P驾驶辅助 出行更加的安全

驾驶辅助和自动驾驶的区别就是需要人为去接管&#xff0c;虽然车辆会根据道路自己行驶&#xff0c;弯道上也能居中自动修正行驶&#xff0c;长时间不接管方向盘&#xff0c;系统会提示人为接管&#xff0c;这就是奔驰的23P驾驶辅助系统&#xff0c; 很多车友升级23P驾驶辅助系…...

AI应用成本工程:让你的LLM系统降本30%-70%的工程实践

成本问题是AI应用规模化的最大障碍 一个运行良好的AI原型&#xff0c;扩展到生产规模时往往面临一个令人震惊的现实&#xff1a;成本。举个典型案例&#xff1a;一个内部知识库问答系统&#xff0c;在100用户规模测试时每月花费约500元&#xff0c;感觉完全可接受。当推广到500…...

机器学习处理不平衡数据:从评估指标到可解释AI的催化剂设计实战

1. 项目概述&#xff1a;当催化剂设计遇上不平衡数据在材料科学和化学工程领域&#xff0c;催化剂设计一直是一项充满挑战的工作。传统的“试错法”不仅成本高昂、周期漫长&#xff0c;而且高度依赖研究人员的经验和直觉。近年来&#xff0c;机器学习&#xff08;ML&#xff09…...

从Python开发者视角,5分钟上手洛书编程语言(解释器1.7.0版)

从Python开发者视角&#xff0c;5分钟上手洛书编程语言&#xff08;解释器1.7.0版&#xff09;如果你已经熟悉Python&#xff0c;那么学习洛书编程语言会是一个有趣的体验。洛书作为一门支持中英文关键字的解释型语言&#xff0c;在设计哲学和语法细节上与Python有着诸多不同。…...

保姆级避坑指南:用Python处理泰坦尼克号数据时,90%新手都会犯的5个错误

保姆级避坑指南&#xff1a;用Python处理泰坦尼克号数据时&#xff0c;90%新手都会犯的5个错误泰坦尼克号数据集是Kaggle上最经典的机器学习入门项目之一&#xff0c;但看似简单的数据背后却暗藏无数新手陷阱。我曾辅导过数百名数据科学初学者&#xff0c;发现他们在处理这个数…...

基于Petri网与机器学习的等离子体化学反应网络简化方法

1. 项目概述与核心挑战在等离子体化学和化学工程领域&#xff0c;我们常常面对一个令人头疼的难题&#xff1a;一个看似简单的物理过程&#xff0c;背后却隐藏着成百上千个相互耦合的化学反应。就拿低温等离子体合成氨&#xff08;NH₃&#xff09;这个经典案例来说&#xff0c…...

ml_edm:基于成本敏感的时间序列早期分类Python工具包详解

1. 项目概述在工业监控、医疗诊断和金融风控这些领域&#xff0c;我们常常面对一个共同的困境&#xff1a;数据是随着时间一点点“流”进来的&#xff0c;但决策却不能等到所有数据都齐备了再做。比如&#xff0c;一台设备传感器传回的振动信号刚开始出现异常&#xff0c;你是立…...

开源工具链一览 评测 观测 安全 编排 哪些值得押注

2024开源DevOps工具链全景指南&#xff1a;评测/观测/安全/编排四大领域&#xff0c;哪些值得长期押注&#xff1f; 副标题&#xff1a;从落地成本、社区活跃度、兼容性、ROI多维度实测&#xff0c;帮你避开90%的工具选型坑&#xff0c;让DevOps转型成功率提升80% 摘要/引言 你…...

C51嵌入式开发中的栈下溢检测与实现

1. C51运行时栈下溢检测原理与实现在嵌入式C51开发中&#xff0c;栈空间管理是个永恒的话题。我曾在一个智能电表项目中&#xff0c;因为栈溢出导致系统随机崩溃&#xff0c;花了整整两周时间才定位到问题。从那以后&#xff0c;我养成了在关键项目中实现运行时栈检查的习惯。栈…...

AI系统误差传播建模:从仿真数据生成到高效参数估计的完整方案

1. 项目概述&#xff1a;当AI系统出错时&#xff0c;误差是如何“传染”的&#xff1f;在自动驾驶汽车、工业机器人或者医疗影像诊断这类复杂的人工智能系统里&#xff0c;一个常见的架构是“流水线”式的多阶段处理。比如&#xff0c;一辆自动驾驶汽车先通过摄像头和激光雷达“…...

ESP32嵌入式AI语音助手安全加固实战指南

1. 这不是“调个API就完事”的玩具项目&#xff0c;而是一次对嵌入式AI终端真实攻防边界的摸底你手头刚拿到一份标榜“ESP32本地LLM语音唤醒”的开源AI语音助手源码&#xff0c;烧录进开发板后&#xff0c;它能听懂“打开灯”“今天天气怎么样”&#xff0c;甚至能用合成语音回…...