小编MF.*_*.OX的帖子

带有Java配置的Spring(Boot)中@Scheduled任务的通用异常处理程序

我在Spring Boot(ver 1.4.2)应用程序中有很多计划任务,并希望使用一个处理程序捕获它们的所有异常,就像使用@ExceptionHandler注释的普通控制器一样.由于线程的原因,此方法不适用于使用@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());
    }

 }
Run Code Online (Sandbox Code Playgroud)

@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.
Run Code Online (Sandbox Code Playgroud)

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

这不是这个问题的重复,因为它明确要求基于Java配置而不是XML的解决方案(因此在没有任何XML配置的情况下将其合并到Spring Boot项目中是不错的).

还有一些答案演示了如何从头开始配置TaskScheduler.例如,此答案要求您还定义池大小,最大池大小,队列容量.是一个解决方案,也需要非常广泛的配置.文档说明了如何配置其他方面,但没有说明如何指定错误处理.但是Java配置所需的最小工作量是什么,这样我才能最大限度地保留Spring Boot默认值(线程池,执行器配置等).

spring scheduled-tasks spring-scheduled spring-boot

9
推荐指数
3
解决办法
4511
查看次数