18

如何自定义@Scheduledspring 注释的异常处理?

我有将在服务器(Tomcat 6)中触发的 Cron 作业,当发生任何异常时,我需要进行一些处理。

  • 春季版 3.2
  • Tomcat 服务器 6
4

3 回答 3

26

如果要使用 Java Config,则需要创建实现SchedulingConfigurer的配置

@EnableScheduling
@Configuration
class SchedulingConfiguration implements SchedulingConfigurer {
    private final Logger logger = LoggerFactory.getLogger(getClass());
    private final ThreadPoolTaskScheduler taskScheduler;

    SchedulingConfiguration() {
        taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setErrorHandler(t -> logger.error("Exception in @Scheduled task. ", t));
        taskScheduler.setThreadNamePrefix("@scheduled-");

        taskScheduler.initialize();
    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskScheduler);
    }
}

您可以根据需要修改错误处理程序。在这里,我只记录一条消息。

不要忘记调用taskScheduler.initialize(); . 没有它你会得到:

java.lang.IllegalStateException: ThreadPoolTaskScheduler not initialized
于 2017-08-13T10:56:55.243 回答
4

为什么不包装你的业务逻辑并在你的@schedule 方法中做一个简单的try catch。然后,您可以记录失败情况或采取任何必要的措施。

@Scheduled(cron = "${schedulerRate}")
public void scheduledJob() {
    try {
        businessLogicService.doBusinessLogic();
    } catch (Exception e) {
        log.error(e);
    }
}
于 2015-07-27T13:13:25.713 回答
4

您可以实现并注册一个ErrorHandler用于ThreadPoolTaskScheduler您的调度注释的。

 <task:annotation-driven scheduler="yourThreadPoolTaskScheduler"  />

 <bean id="yourThreadPoolTaskScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
        <property name="poolSize" value="5" />
        <property name="errorHandler" ref="yourScheduledTaskErrorHandler" />
 </bean>

 <bean id="yourScheduledTaskErrorHandler" 
     class="com.example.YourScheduledTaskErrorHandler"/>
于 2016-03-01T18:41:52.563 回答