Spring 3.2的异常处理@“预定”;注释

Spring 3.2的异常处理@“预定”;注释,spring,exception,quartz-scheduler,spring-scheduled,Spring,Exception,Quartz Scheduler,Spring Scheduled,如何定制spring注释的异常处理 我有Cron作业,这些作业将在服务器(tomcat6)中触发,当出现任何异常时,我需要进行一些处理 Spring版本3.2 Tomcat服务器6 为什么不包装您的业务逻辑并在@schedule方法中进行简单的尝试捕获呢。然后,您可以记录或采取故障案例所需的任何操作 @Scheduled(cron = "${schedulerRate}") public void scheduledJob() { try { businessLogic

如何定制spring注释的异常处理

我有Cron作业,这些作业将在服务器(tomcat6)中触发,当出现任何异常时,我需要进行一些处理

  • Spring版本3.2
  • Tomcat服务器6

为什么不包装您的业务逻辑并在@schedule方法中进行简单的尝试捕获呢。然后,您可以记录或采取故障案例所需的任何操作

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

您可以为用于调度批注的
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"/>

如果您想使用Java配置,您需要创建配置实现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

您所说的自定义异常处理是什么意思?你不能在
@Scheduled
方法中处理任何异常吗?@geo是的,我可以。但是我需要记录关于工作的信息,例如失败或成功。有什么通用的方法可以做到这一点吗?根据您的需要,SpringAOP可能值得一看into@geoand,如果你有任何例子,你能在这里给我解释一下吗?谢谢。如果您需要在all@Scheduled方法之前做一些事情,您应该查看Spring AOP。实现通用错误处理程序更清晰、更安全、更方便。然后,您不需要记住每个计划任务,就可以用try-catch来包装它。除此之外,如果你有1000个不同的任务,一天之后你将需要更改所有任务的异常处理,那么如果你必须修改所有任务,那么祝你好运。同意,我认为错误处理程序直到Spring V4才出现,但我现在发现我错了,直到V4才需要它,我的错。