Spring bootで定期的な実行 Taskを作る話

はい、そういやどうやったかな?と思い出しながら作った話です

前回はシンプルなHello worldを作りました

前回 : Spring boot Applicationを作る話

それから次に定期的な実行をするってのをまとめておきます

初めに

そういえば、前回は何で使っていたかなと思うと、Raspberry piにてサーバへ情報の更新を確認するのに使っていましたな。

そんな定期的な確認を行うのがこのtaskです

ソース : https://github.com/wataru775/example.spring.boot.task

大まかにまとめますと

fixedDelay起動時から何秒[ms]後に実行するか?ソース
fixedRate起動時点から何秒[ms]後に実行するか?ソース
initialDelay起動時から何秒後に何秒間隔に実行するか?ソース
croncron書式で指定しますソース

そんな感じです。

詳細はこちらを参考ください :

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/annotation/Scheduled.html

実行

例を組み込んだ例を実行しますとこんな感じです


  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.6.2)

2022-01-05 22:30:06.348  INFO 75386 --- [           main] o.m.springboot.example.task.Application  : Starting Application using Java 13.0.1 on MacBook-Pro.local with PID 75386 (./task/target/classes started by wataru in ./task)
2022-01-05 22:30:06.349  INFO 75386 --- [           main] o.m.springboot.example.task.Application  : No active profile set, falling back to default profiles: default
2022-01-05 22:30:06.742  INFO 75386 --- [   scheduling-1] o.m.s.e.t.tasks.ScheduledFixedRateTask   : fixedRate do
2022-01-05 22:30:06.742  INFO 75386 --- [   scheduling-1] o.m.s.e.t.tasks.ScheduledFixedDelayTask  : fixedDelay job
2022-01-05 22:30:06.746  INFO 75386 --- [           main] o.m.springboot.example.task.Application  : Started Application in 0.654 seconds (JVM running for 0.907)
2022-01-05 22:30:07.543  INFO 75386 --- [   scheduling-1] o.m.s.e.t.t.ScheduledInitialDelayTask    : initialDelay do
2022-01-05 22:30:09.743  INFO 75386 --- [   scheduling-1] o.m.s.e.t.tasks.ScheduledFixedDelayTask  : fixedDelay job
2022-01-05 22:30:11.744  INFO 75386 --- [   scheduling-1] o.m.s.e.t.tasks.ScheduledFixedRateTask   : fixedRate do
2022-01-05 22:30:12.542  INFO 75386 --- [   scheduling-1] o.m.s.e.t.t.ScheduledInitialDelayTask    : initialDelay do
2022-01-05 22:30:12.748  INFO 75386 --- [   scheduling-1] o.m.s.e.t.tasks.ScheduledFixedDelayTask  : fixedDelay job
2022-01-05 22:30:15.752  INFO 75386 --- [   scheduling-1] o.m.s.e.t.tasks.ScheduledFixedDelayTask  : fixedDelay job

... 略 ...

2022-01-05 22:30:56.746  INFO 75386 --- [   scheduling-1] o.m.s.e.t.tasks.ScheduledFixedRateTask   : fixedRate do
2022-01-05 22:30:57.542  INFO 75386 --- [   scheduling-1] o.m.s.e.t.t.ScheduledInitialDelayTask    : initialDelay do
2022-01-05 22:30:57.800  INFO 75386 --- [   scheduling-1] o.m.s.e.t.tasks.ScheduledFixedDelayTask  : fixedDelay job
2022-01-05 22:31:00.005  INFO 75386 --- [   scheduling-1] o.m.s.e.t.tasks.ScheduledFixedDelayTask  : cron job
2022-01-05 22:31:00.805  INFO 75386 --- [   scheduling-1] o.m.s.e.t.tasks.ScheduledFixedDelayTask  : fixedDelay job
2022-01-05 22:31:01.744  INFO 75386 --- [   scheduling-1] o.m.s.e.t.tasks.ScheduledFixedRateTask   : fixedRate do
2022-01-05 22:31:02.548  INFO 75386 --- [   scheduling-1] o.m.s.e.t.t.ScheduledInitialDelayTask    : initialDelay do
2022-01-05 22:31:03.808  INFO 75386 --- [   scheduling-1] o.m.s.e.t.tasks.ScheduledFixedDelayTask  : fixedDelay job
2022-01-05 22:31:06.743  INFO 75386 --- [   scheduling-1] o.m.s.e.t.tasks.ScheduledFixedRateTask   : fixedRate do
2022-01-05 22:31:06.813  INFO 75386 --- [   scheduling-1] o.m.s.e.t.tasks.ScheduledFixedDelayTask  : fixedDelay job

はい、実行すると、アプリケーションを起動すると初回(22:30:06.348)にfixedRate(5000ms)とfixedDelay(3000ms)が指定秒数間隔で実行されているのがわかります。

起動後 0.8秒後に5秒間隔にinitialDelayが実行されていることが確認できます

そして、時間が0秒のタイミングでcronが実行されます

ポイント

ここでのポイントは、呼び出し元です。

@SpringBootApplication
@EnableScheduling
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

呼び出し元では特にそれぞれを呼んでいません。

@EnableSchedulingを定義していれば、@Scheduledを定義ている @Componentを勝手に実行されますので超便利です。

確か(ソースはどっか行った)では、複数のサーバを監視するという感じで使っていました。

終いに

今回はspring bootでの定期実行taskを紹介してみました。

ってか、Raspberry piにて書くのと話で MQを監視するにはどうするかな?とかなったのでまとめておきたかっただけです。

次回は… パーツではなく本ちゃんに移りたいななどと考えていたりもしますが…

MQ監視でしょうかねw

簡単にRaspberry piで実装したい部分はMQを定期監視してメッセージが来れば機材の処理をするってのを考えていますのでその辺りがポイントになりますわね。

なので、次回!