定期的にタスクを実行(スケジューリング)

今回は、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書き方の例がありましたので、記載しておきます。

crondescription
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秒時に実行.
https://qiita.com/rubytomato@github/items/4f0c64eb9a24eaceaa6e

コメントを残す