如何自定义@Scheduled
spring 注释的异常处理?
我有将在服务器(Tomcat 6)中触发的 Cron 作业,当发生任何异常时,我需要进行一些处理。
- 春季版 3.2
- Tomcat 服务器 6
如何自定义@Scheduled
spring 注释的异常处理?
我有将在服务器(Tomcat 6)中触发的 Cron 作业,当发生任何异常时,我需要进行一些处理。
如果要使用 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
为什么不包装你的业务逻辑并在你的@schedule 方法中做一个简单的try catch。然后,您可以记录失败情况或采取任何必要的措施。
@Scheduled(cron = "${schedulerRate}")
public void scheduledJob() {
try {
businessLogicService.doBusinessLogic();
} catch (Exception e) {
log.error(e);
}
}
您可以实现并注册一个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"/>