Exception handling for Spring 3.2 “@Scheduled” annotation

后端 未结 3 1706
野性不改
野性不改 2020-12-17 14:19

How to customize the exception handling for @Scheduled annotation from spring ?

I have Cron jobs which will be triggered in the server (Tomcat 6) and when any except

相关标签:
3条回答
  • 2020-12-17 14:46

    If you want to use Java Config you will need to create configuration implementing 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);
        }
    }
    

    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
    
    0 讨论(0)
  • 2020-12-17 14:49

    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);
        }
    }
    
    0 讨论(0)
  • 2020-12-17 14:58

    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"/>
    
    0 讨论(0)
提交回复
热议问题