gpt4 book ai didi

spring - 使用 Java 配置在 Spring(Boot)中使用 @Scheduled 任务的通用异常处理程序

转载 作者:行者123 更新时间:2023-12-02 05:30:50 25 4
gpt4 key购买 nike

我的 Spring Boot(版本 1.4.2)应用程序中有很多计划任务,并且希望使用一个处理程序捕获它们的所有异常,就像使用 @ExceptionHandler 的普通 Controller 一样。注解。由于线程的原因,此方法不适用于使用 @Scheduled 注释定义的任务:

@Component
public class UpdateJob {
@Transactional
@Scheduled(cron = "0 1 0 * * *")
public void runUpdateUsers() {
userService.updateUsers();
}

@ExceptionHandler
public void handle(Exception e) {
// some more logic here
logger.error(e.getMessage());
}

}

@ExceptionHandler 不适用于 @Scheduled 方法(事实证明它并不意味着如此)。相反,Spring Boot 使用它自己的 LoggingErrorHandler :

2016-12-08 15:49:20.016 ERROR 23119 --- [pool-7-thread-1] o.s.s.s.TaskUtils$LoggingErrorHandler    : Unexpected error occurred in scheduled task.

我可以以某种方式替换或提供计划任务的默认异常处理程序吗?或者切换到 PropagatingErrorHandler 是否有意义(并且可能)?据我了解,这会进一步传播错误?有没有其他方法可以仅使用 Java 配置(不使用 XML)来实现目标?

这不是 this question 的重复项因为它明确要求基于 Java 配置而不是 XML 的解决方案(因此无需任何 XML 配置即可合并到 Spring Boot 项目中)。

还有一些答案演示了如何从头开始配置 TaskScheduler。例如这个answer要求您还定义池大小、最大池大小、队列容量。 Here是一个也需要非常广泛的配置的解决方案。 Documentation显示如何配置其他方面,但不显示如何指定错误处理。但是,Java 配置所需的最少工作是什么,以便我可以最大限度地保留 Spring Boot 默认值(线程池、执行器配置等)。

最佳答案

以下是设置自定义错误处理程序的示例(Spring 2.0.2):

@Bean
public TaskScheduler taskScheduler() {
ConcurrentTaskScheduler scheduler = new ConcurrentTaskScheduler();
scheduler.setErrorHandler(throwable -> { /* custom handler */ });
return scheduler;
}

关于spring - 使用 Java 配置在 Spring(Boot)中使用 @Scheduled 任务的通用异常处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41041536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com