Exception handling for Spring 3.2 "@Scheduled" annotation
If you want to use Java Config you will need to create configuration implementing SchedulingConfigurer
@EnableScheduling@Configurationclass 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); }}
You can modify error handler for your needs. Here I only log a message.
Don't forget to call taskScheduler.initialize();. Without it you'll get:
java.lang.IllegalStateException: ThreadPoolTaskScheduler not initialized
Why not wrap your business logic and do a simple try catch in your @schedule method. Then you can log or take whatever action is necessary for failure cases.
@Scheduled(cron = "${schedulerRate}")public void scheduledJob() { try { businessLogicService.doBusinessLogic(); } catch (Exception e) { log.error(e); }}
You could implement and register an ErrorHandler
for the ThreadPoolTaskScheduler
that is used for your scheduling annotations.
<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"/>