春からの @Scheduled
アノテーションの例外処理をカスタマイズする方法は?
サーバー(Tomcat 6)でトリガーされるCronジョブがあり、例外が発生したときに何らかの処理を行う必要があります。
スケジューリングアノテーションに使用される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"/>
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メソッドで簡単なtrycatchを実行してみませんか。次に、ログに記録するか、障害の場合に必要なアクションを実行できます。
@Scheduled(cron = "${schedulerRate}")
public void scheduledJob() {
try {
businessLogicService.doBusinessLogic();
} catch (Exception e) {
log.error(e);
}
}