毎日の春のcron式1:01:am


202

Spring cron式に基づいて、コードを一定のスケジュールで実行しようとしています。毎日1:01:amにコードを実行してほしい。次の式を試してみましたが、気になりませんでした。ここの構文の何が問題になっていますか?

@Scheduled(cron = "0 1 1 ? * *")
public void resetCache() {
    // ...
}



私のcron式0 0 0 1 JAN MONは昨年まで働いていました。1月1日以降、無効なcron式を言って動作を停止します。これは非常に低い頻度を意図したものですが、tcサーバーを実行することができました。1月1日以降はそうではありませんでした。0 0 7に変更した場合?* SUNそれは働き始めました。私は好奇心旺盛です。なぜ0 0 0 1 JAN MONは去年のjanのようにうまく機能しなくなったのです。
spandey 2018年

0 0 0 1 JAN MONは間違った表現である可能性があります。これもうまく機能しており、tcサーバーは文句を言わない
spandey

回答:


573

試してみてください:

@Scheduled(cron = "0 1 1 * * ?")

以下に、Springフォーラムのサンプルパターンを示します。

* "0 0 * * * *" = the top of every hour of every day.
* "*/10 * * * * *" = every ten seconds.
* "0 0 8-10 * * *" = 8, 9 and 10 o'clock of every day.
* "0 0 8,10 * * *" = 8 and 10 o'clock of every day.
* "0 0/30 8-10 * * *" = 8:00, 8:30, 9:00, 9:30 and 10 o'clock every day.
* "0 0 9-17 * * MON-FRI" = on the hour nine-to-five weekdays
* "0 0 0 25 12 ?" = every Christmas Day at midnight

cron式は6つのフィールドで表されます。

second, minute, hour, day of month, month, day(s) of week

(*) いずれかに一致することを意味します

*/X 「Xごと」を意味します

?(「特定の値なし」)-文字が許可されている2つのフィールドの一方に何かを指定する必要があるが、もう一方は指定できない場合に役立ちます。たとえば、月の特定の日(たとえば、10日)にトリガーを起動したいが、何曜日が何であるかは気にしない場合、その日に「10」を入力します。月のフィールドと「?」曜日フィールド。

PS:これを機能させるには、アプリケーションコンテキストで有効にしてください:https : //docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html#scheduling-注釈サポート


15
-フォーマットもここに春自体に記載されてdocs.spring.io/spring/docs/3.0.x/api/org/springframework/...
chrismarx

1
春のcronは秒のプロビジョニングも提供できると思いますが、通常のUNIXのcronは分ベースです... unixのmanページのように、分は構成可能な時間の最小単位です。
nanosoft 2015年

8
「?」の意味は何ですか キャラクター?「曜日」フィールドにのみ適用されますか?「?」を置き換えた場合、それは機能しますか/何か異なることをしますか クリスマスの例で「*」を使用しますか?
15年

1
@encrestはこちらをご覧ください:stackoverflow.com/questions/11499740/…–
gipinani

1
Trey

90

私のスケジューラーでは、それを毎日午前6時に起動するために使用しており、私のcron表記は次のとおりです。

0 0 6 * * *

1:01:amが必要な場合は、

0 1 1 * * *

スケジューラの完全なコード

@Scheduled(cron="0 1 1 * * *")
public void doScheduledWork() {
    //complete scheduled work
}

** 非常に重要

スケジューラの発火時刻の正確さを確認するには、次のようにゾーン値を設定する必要があります(私はイスタンブールにいます):

@Scheduled(cron="0 1 1 * * *", zone="Europe/Istanbul")
public void doScheduledWork() {
    //complete scheduled work
}

ここから完全なタイムゾーン値を見つけることができます。

注:私のSpringフレームワークのバージョンは、4.0.7.RELEASEです。


1
正解が12問しかないのに、なぜ12しか答えられないのかわかりません。

2
@MoayadAbuJaberどうもありがとうございました。スコアは重要ではありません。開発者が私の答えで問題を修正できれば十分です、乾杯。
Bahadir Tasdemir

xml config shedulerでゾーンを使用できます<task:scheduled ref="paypalCronJob" method="runTask" cron="0 0 6 * * * ?"/>か?
シャリーフ2017年

3
タイムゾーンについて言及するのが
好き

2
ありがとう、@ Forhad。あなたが開発者であり、日付と時刻に関連する問題に対処している場合、タイムスタンプ、タイムゾーン、および変換の詳細を知っている必要があります。そうでなければ、あなたのデータはナンセンスになります
Bahadir Tasdemir

22

メソッドでアノテーションを付けることができます@Scheduled(cron ="0 1 1 * * ?")

0-秒

1〜1分

1-時間。


12

gipinaniの答えに欠けているもの

@Scheduled(cron = "0 1 1,13 * * ?", zone = "CST")

これは1.01と13.01で実行されます。1日に複数回パターンなしでジョブを実行する必要がある場合に使用できます。

また、リモートサーバーで展開を行う場合、zone属性は非常に役立ちます。これはSpring 4で導入されました。


2
省略形(タイムゾーン用)のサポートはJDK 1.1.x互換性のためだけであり、フルネームを使用する必要があることに注意してください
-javadocのように

6

私が気付いたのは、春のCronTriggerはcronではないということです。有効なcron式(cronmaker.comで検証できるもの)に7つのパラメーターが含まれ、それを受け入れない場合があります。ほとんどの場合、最後のパラメーターを削除するだけですべてが正常に機能します。


1
「CronTriggerはクォーツではありません」
Sandy Simonton、

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.