レガシー Java/Spring/Hibernate プロジェクト内で cron ジョブを動作させようとしているので、Spring スケジューラを使用することにしました。
myTask.doStuff を毎月第 1 日曜日の 12:00 に実行します。
application-context.xml で、タスク スケジューラを次のように構成しました。
<task:scheduled-tasks scheduler="MyTaskScheduler">
<task:scheduled ref="myTask" method="doStuff" cron="0 0 12 ? 1/1 SUN#1 *"/> <!-- Every first Sundy of the month -->
</task:scheduled-tasks>
<task:scheduler id="MyTaskScheduler" pool-size="10"/>
問題の cron 式自体は次のようになります。0 0 12 ? 1/1 日曜日#1 *
これは、ユニット テストから実行すると完全に機能する とmyTask
呼ばれるメソッドを持つ Bean です。doStuff
ビルドしてデプロイすると、Spring からブートタイム例外が発生します。
Caused by: java.lang.IllegalArgumentException: cron expression must consist of 6 fields (found 7 in 0 0 12 ? 1/1 SUN#1 *)
at org.springframework.scheduling.support.CronSequenceGenerator.parse(CronSequenceGenerator.java:233)
at org.springframework.scheduling.support.CronSequenceGenerator.<init>(CronSequenceGenerator.java:81)
at org.springframework.scheduling.support.CronTrigger.<init>(CronTrigger.java:54)
at org.springframework.scheduling.support.CronTrigger.<init>(CronTrigger.java:44)
at org.springframework.scheduling.config.ScheduledTaskRegistrar.afterPropertiesSet(ScheduledTaskRegistrar.java:129)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
初めてcron式を使用しているので、最初は何か間違っているのではないかと考えましたが、クローンメーカーそして同じ結果になりました。
すべてのドキュメントには次のように記載されています: cron 式は、6 つまたは 7 つのサブ式 (フィールド) で構成される文字列です。1
それにもかかわらず、どの例にも含まれていない 7 番目の要素 (年) を削除しようとしたところ、別のエラー メッセージが表示されました。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.scheduling.config.ScheduledTaskRegistrar#0': Invocation of init method failed; nested exception is java.lang.NumberFormatException: For input string: "0#1"
... org.springframework.scheduling は、他のすべてとは異なる種類の cron をサポートしていますか?Spring固有のドキュメント単に「cron 式」と表示されます。
このコンテキストでこの cron 式を期待どおりに動作させるにはどうすればよいですか? どのような助けでもいただければ幸いです。
現時点での私の解決策は、この式を単純化して毎週日曜日に実行し、その月のどの日曜日であるかを計算する Java ロジックを先頭に追加して、それが機能するかどうかを確認することですが、これは構成アプローチの目的に反するものであり、アンチパターンのように思えます。
ベストアンサー1
春のスケジュールされたタスクはないcron 式と同じ形式です。
これらは UNIX cron 式と同じ形式に従いません。
フィールドは 6 つだけです。
- 2番、
- 分、
- 時間、
- 月日、
- 月、
- 週の曜日。
アスタリスク (*) はいずれかに一致することを意味します。 */X は「すべての X」を意味します (例を参照)。
数字による曜日は私には合いません。それに、「MON-FRI」の方がずっと読みやすいです。次にいくつかの例を示します。
"0 0 18 * * MON-FRI" means every weekday at 6:00 PM.
"0 0 */1 * * *" means every hour on the hour.
"0 0 */8 * * *" means every 8 hours on the hour.
"0 0 12 1 * *" means 12:00 PM on the first day of every month.
ここでいくつか見つけられます追加情報。
また、春のドキュメントは役に立つ。