web-dev-qa-db-ja.com

Spring3.2の「@Scheduled」アノテーションの例外処理

春からの @Scheduled アノテーションの例外処理をカスタマイズする方法は?

サーバー(Tomcat 6)でトリガーされるCronジョブがあり、例外が発生したときに何らかの処理を行う必要があります。

  • Springバージョン3.2
  • Tomcatサーバー6
17
user3515080

スケジューリングアノテーションに使用されるErrorHandlerThreadPoolTaskScheduler を実装して登録できます。

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

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
19
Mariusz.v7

ビジネスロジックをラップして、@ scheduleメソッドで簡単なtrycatchを実行してみませんか。次に、ログに記録するか、障害の場合に必要なアクションを実行できます。

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