Spring bootで定期的な実行 Taskを作る話
はい、そういやどうやったかな?と思い出しながら作った話です
前回はシンプルなHello worldを作りました
前回 : Spring boot Applicationを作る話
それから次に定期的な実行をするってのをまとめておきます
初めに
そういえば、前回は何で使っていたかなと思うと、Raspberry piにてサーバへ情報の更新を確認するのに使っていましたな。
そんな定期的な確認を行うのがこのtaskです
ソース : https://github.com/wataru775/example.spring.boot.task
大まかにまとめますと
fixedDelay | 起動時から何秒[ms]後に実行するか? | ソース |
fixedRate | 起動時点から何秒[ms]後に実行するか? | ソース |
initialDelay | 起動時から何秒後に何秒間隔に実行するか? | ソース |
cron | cron書式で指定します | ソース |
そんな感じです。
詳細はこちらを参考ください :
実行
例を組み込んだ例を実行しますとこんな感じです
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: 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を定期監視してメッセージが来れば機材の処理をするってのを考えていますのでその辺りがポイントになりますわね。
なので、次回!