我在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());
    }
 }
@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)来实现目标?
这不是这个问题的重复,因为它明确要求基于Java配置而不是XML的解决方案(因此在没有任何XML配置的情况下将其合并到Spring Boot项目中是不错的).
还有一些答案演示了如何从头开始配置TaskScheduler.例如,此答案要求您还定义池大小,最大池大小,队列容量.这是一个解决方案,也需要非常广泛的配置.文档说明了如何配置其他方面,但没有说明如何指定错误处理.但是Java配置所需的最小工作量是什么,这样我才能最大限度地保留Spring Boot默认值(线程池,执行器配置等).
我已经能够找到无数关于如何在 Spring MVC 或 Spring REST 中捕获未处理的异常的教程,但我想知道的是如何在不使用 Spring Web 框架的情况下捕获未处理的异常。
我正在编写一个没有 Web 组件的应用程序,并且我不打算仅为异常处理而导入 Spring Web。
当@Service抛出未处理的异常时,我需要捕获它,以便我可以将其正确记录到Raygun。
例如,考虑一个故意抛出未捕获异常的服务中的这个方法:
@Scheduled(fixedDelay = 100)
public void doSomething() {
    throw new RuntimeException("Uh oh!");
}
它的输出将是:
2017-08-16 00:19:40.202 ERROR 91168 --- [pool-1-thread-1] o.s.s.s.TaskUtils$LoggingErrorHandler    : Unexpected error occurred in scheduled task.
java.lang.RuntimeException: Uh oh!
    at com.mitchtalmadge.example.ExampleService.doSomething(ClassSyncService.java:48) ~[classes/:na]
    at com.mitchtalmadge.example.ExampleService$$FastClassBySpringCGLIB$$1dd464d8.invoke(<generated>) ~[classes/:na]
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.10.RELEASE.jar:4.3.10.RELEASE]
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:669)
    ...
我怎么抓住它?
没有简单的方法可以做到这一点吗?