Spring 3.2“@Scheduled”注释的异常处理

时间:2014-06-04 07:36:06

标签: spring exception-handling quartz-scheduler spring-scheduled

如何自定义" @ Scheduled"的异常处理春天的注释?

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

Spring 3.2版 Tomcat Server 6

3 个答案:

答案 0 :(得分:15)

如果您想使用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

答案 1 :(得分:2)

您可以为用于调度注释的ThreadPoolTaskScheduler实施并注册ErrorHandler

 <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"/>

答案 2 :(得分:0)

为什么不包装您的业务逻辑并在@schedule方法中执行简单的try catch。然后,您可以记录或采取失败案例所需的任何操作。

@Scheduled(cron = "${schedulerRate}")
public void scheduledJob() {
    try {
        businessLogicService.doBusinessLogic();
    } catch (Exception e) {
        log.error(e);
    }
}