怎么捕获定时任务的自定义异常

controller的异常可以用@RestControllerAdvice(@ControllerAdvice)
@ExceptionHandler捕获处理,但是定时任务的异常也想用这种方式捕获处理,怎么操作

参考一下 希望有帮助


使用java.util.Timer实现定时任务产生的异常_Qfoom的博客-CSDN博客_timertask 异常 https://www.cnblogs.com/wuxun1997/p/6822904.html定时任务用Timer实现有可能出现异常,因为它是基于绝对时间而不是相对时间进行调度的。当环境的系统时间被修改后,原来的定时任务可能就不跑了。另外需要捕获并处理定时任务抛出的异常。如果在TimerTask里抛出了异常,那么Timer认为定时任务被取消并终止执行线程。举例:package com.wlf.concurrent;import java.util.Timer;import java.util https://blog.csdn.net/Qfoom/article/details/112977570?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%80%8E%E4%B9%88%E6%8D%95%E8%8E%B7%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89%E5%BC%82%E5%B8%B8&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~sobaiduweb~default-0-112977570.nonecase&spm=1018.2226.3001.4450

定时任务可以内部处理异常,记录日志。你定时任务没有用户啊,你这么捕获异常这提示给谁?

定时任务是与前端用户没有交互的,所有是没法走RestControllerAdvice的,如果你想给前端用户展示,你能新建一张表,然后每次运行时插入一条记录,异常就把异常转换为String,然后入库,最后通过一个列表的接口给用户展示,可以用apache的lang3包

org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e)

其实你就是想定位问题嘛,定位问题的方式有很多:

  1. 日志上对进程打唯一标识
  2. 捕获异常,将异常数据持久化,等待日后分析
  3. (开发环境)开启调试监听,等待异常阻塞请求的发送

具体就看你像怎么处理问题了

统一捕获定时任务的异常并插入数据库.
整体来说都需要你自己将异常往一个固定的地方送.要么直接送数据库,要么送到一个特定地点等待其他程序将其送入数据库
要将定时任务异常信息入库,我提供两种可选方式,
一是自己直接在定时任务内捕获,然后调用dao往数据库存
二是发布一个定时任务异常的事件,由事件订阅者去处理.
如果你是想在一个类似ControllerAdvice的类中对各种定时任务中可能出现的异常做统一处理,那建议使用第二种方式.
在定时任务中捕获异常,然后使用事件发布将异常事件发布出去.
异常事件你看一下你具体有几类异常要处理,定义不同的事件,或者就只定义一个事件,将事件源(发生异常的定时任务本身)和异常对象放到事件对象中,再处理时直接判断异常类型.
处理你的事件的是一个事件监听器(你自己定义),其监听指定类型的事件,就像ControllerAdvice捕获指定的异常.
具体的使用方式参考springboot 事件机制.
定时任务中发布事件需要获取发布者对象,这个可以声明一个上下文类,将其注入到spring,同时提供静态get上下文的方法,再从中get发布者.

Spring异常处理@ControllerAdvice+@ExceptionHandler注解的使用
https://blog.csdn.net/y516369/article/details/125592500