Exception handling for Spring 3.2 "@Scheduled" annotation Exception handling for Spring 3.2 "@Scheduled" annotation spring spring

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