今回は、SpringBootで定期的にタスクを実行する(スケジューリング)について調べてみたいと思います。
サンプルプロジェクト構造

- BatchTasks:定期的に実行したいタスクを定義します。(Controller呼び出し元と成ります。)
- PostController:サンプルコードでタスクを行うControllerです。
サンプルコード
BatchApplication.java
@SpringBootApplication
@EnableScheduling
public class BatchApplication {
public static void main(String[] args) {
SpringApplication.run(BatchApplication.class, args);
}
}
- @EnableScheduling:スケジューリングを使うために、許可するアノテーションです。
BatchTasks.java
@Slf4j
@Component
public class BatchTasks {
@Autowired
private RestTemplate restTemplate;
private static final String URL_POST_DELETE_BATCH = "http://localhost:8080/post/delete";
private static final String TASK_ZONE = "Asia/Tokyo";
@Scheduled(cron = "${cron.post-delete}", zone = TASK_ZONE)
public void execute() {
log.info("deletePostBatch() start");
restTemplate.delete(URL_POST_DELETE_BATCH);
log.info("deletePostBatch() end");
}
}
- @Scheduled:定期的に実行したいメソッドに指定します。
- cronで指定した周期でtaskを実行します。
- cronの起動時間のタイムゾーンを指定する. 未指定時はデフォルトのtimezoneを使用します。
- RestTemplate:restAPIを呼び出すために使います。
- excuteメソッドは「http://localhost:8080/post/delete」を呼び出しています。
PostController.java
@RestController
public class PostController {
@DeleteMapping("/post/delete")
public void deletePost() {
System.out.println("ポストの削除バッチです。");
}
}
- サンプルでは文字列出力となっていますが、実際にはサービスを読んでビジネスロジックを処理したりします。
application.yml
cron: post-delete: "0 0 3 * * *" # ポスト削除バッチ、起動:毎日、03時00分00秒
- タスクの周期を指定しています。
- @Scheduledアノテーションに直接文字列で渡すこともできますが、業務では設定ファイルなどに記述した方が管理しやすいでしょう。
終わりに
Spring Batchを使うときは、依存性を追加する必要がありますが、スケジューリングの場合はSpring Starterだけ追加するば動きます。
追記で、cron書き方の例がありましたので、記載しておきます。
| cron | description |
|---|---|
0 0 * * * * | 毎時、0分0秒時に実行. |
0 0 0 * * * | 毎日、0時0分0秒に実行. |
0 0 0 1 * * | 毎月、1日0時0分0秒に実行. |
0 0 12 */5 * * | 毎月、5の倍数の日の12時0分0秒に実行. |
0 0 9-18 * * 1-5 | 月から金曜日の9時から18時の0分0秒時に実行. |
