Spring cronと通常のcronの違いは?質問する

Spring cronと通常のcronの違いは?質問する

レガシー 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. 

ここでいくつか見つけられます追加情報

また、春のドキュメントは役に立つ

おすすめ記事