当前位置: 首页 > 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();}}
http://www.lryc.cn/news/214884.html

相关文章:

  • Android 默认关闭自动旋转屏幕功能
  • 软文推广方案,媒介盒子分享
  • CSDN热榜分析6:将实时爬取的热榜数据导入sqlite
  • 2023年11月1日,Google全新域名来袭:.ing域名现已问世!
  • 【设计模式】第22节:行为型模式之“状态模式”
  • JavaSE21——ArrayList
  • 找质数(枚举 埃氏筛 线性筛)
  • 第十二章 ObjectScript 系统标志和限定符 (qspec) - 标志
  • 解决Windows Server 2012 由于没有远程桌面授权服务器可以提供需求可证
  • 上位机底部栏 UI如何设置
  • MySQL表的增删改查(基础)
  • uniapp书写顶部选项卡代码详细例子
  • 注册中心ZK、nameServer、eureka、Nacos介绍与对比
  • 杂志详情。
  • 前端知识与基础应用#2
  • 【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割6(数据预处理)
  • 硬件加速器及其深度神经网络模型的性能指标理解
  • 嵌入式每日500(4)231104 (Flash类型定义、Flash常量定义、Flash函数)
  • 21款奔驰GLC300L升级23P驾驶辅助 出行更加的安全
  • 【小黑嵌入式系统第七课】PSoC® 5LP 开发套件(CY8CKIT-050B )——PSoC® 5LP主芯片、I/O系统、GPIO控制LED流水灯的实现
  • 深度学习简史
  • CSRF 和 XSS 是什么
  • 亚信科技发布“电信级”核心交易数据库AntDB7.0,助力政企“信”创未来!
  • 硬件调试-电源纹波测量
  • 【洛谷算法题】P5710-数的性质【入门2分支结构】
  • arcgis图上添加发光效果!
  • [MySQL]——SQL预编译、动态sql
  • 安装ifconfig命令(两步搞定)
  • 【蓝桥杯 第十届省赛Java B组】真题训练(A - H)H待更新
  • 【牛客题】二进制求和 <模拟>