SpringBootタイミングタスクで遭遇したピット

3737 ワード

前言
SpringbootはタイミングタスクScheduleモジュールをサポートしており、一般的には実際のニーズを完全に満たすことができます.今日は私がscheduleを使ったときに踏んだ穴を記録しましょう.
タイミングを使用するには、まずサポートを開始します.実は、起動クラスに注釈を付けるとOkになります.

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

このブログのテーマは踏んだ穴を記録することです.具体的なタイミングタスクをどのように使うかは書きません.私のブログSpringのタイミングタスクを参考にしてください.
今日踏んだこの穴はcron式と関係があるので、まずcron式の解釈を見てみましょう.
Cron式は文字列で、文字列は5つまたは6つのスペースで区切られ、6つまたは7つのドメインに分けられ、各ドメインは1つの意味を表します.
説明する
*第一位、秒を表す、値0-59*第二位、分を表す、値0-59*第三位、時間を表す、値0-23*第四位、日付日/日、値1-31*第五位、日付月、値1-12*第六位、曜日、値1-7、月曜日、火曜日...          また、1は日曜日、2は月曜日を表します.*7番目は、年、空にすることができて、値1970-2099(*)の星号を取ることができます:毎秒、毎分、毎日、毎月、毎年...(?)の疑問符を理解することができます:疑問符は日付と曜日の2つの位置にしか現れなくて、この位置の値が確定していないことを表して、毎日3時に実行して、だから6番目の曜日の位置、私達は関心を持つ必要はなくて、不確定な値です.同時に、日付と曜日は互いに反発する2つの要素であり、疑問符によって値が指定されていないことを示します.例えば、1月10日、例えば月曜日、曜日の位置が別の火曜日であれば、前後で衝突します.(-)マイナス記号:時間フィールドで「10-12」を使用している場合は10~12ポイント、すなわち10,11,12(,)カンマ:リスト値を表し、曜日フィールドで「1,2,4」を使用している場合は月曜日、火曜日、木曜日(/)スラッシュを表します.たとえば、x/y、xは開始値、yはステップ長、たとえば1位(秒)0/15は0秒から15秒ごとに、最後に0,15,30,45,60    また、*/yは、0/yに等しい
注:これは公式解釈です
0 0 3 * * ?     毎日3時に0 5 3*を実行しますか?     毎日3時5分に0 5 3?*を実行します.     毎日3时5分に実行して、上の作用と同じ0 5/10 3*ですか?  毎日3時の5分、15分、25分、35分、45分、55分のこのいくつかの時点で0 10 3を実行しますか?*1    毎週日曜日、3時10分に実行します.注意:1は日曜日を表します.    0 10 3 ? * 1#3  毎月の3週目、日曜日に実行され、#号は週の位置にのみ表示されます.
ここで説明したいのは、springBootのscheduleがサポートしているcron式がこれとあまり一致していないことです.公式に言った週は、1は日曜日で、順番に類推していますが、私はテストの過程で、1は実際に月曜日を代表しています.
では、コードとテスト結果を貼りましょう.

@Component
@EnableScheduling
public class Task {
 private static final Logger LOGGER = MyLogger.getLogger(Task.class);
 @Scheduled(cron = "0 46 20 ? * 1")
 public void task() {
  LOGGER.info("       ");
 }

テスト結果:
2017-05-08 20:46:00.006  INFO 18838 --- [pool-1-thread-1] com.yiyexy.task.Task                     : 今日は日曜日だそうです.
上記の説明によると、6番目のドメインは週で、値が1の場合は日曜日に実行されますが、私の実行結果は月曜日に実行されていることを示しています.私はここで仕方がありません.
最後に曜日を単語で表すと、このような問題は起こらないと思います.

@Component
@EnableScheduling
public class Task {
 private static final Logger LOGGER = MyLogger.getLogger(Task.class);
 @Scheduled(cron = "0 49 20 ? * MON")
 public void task() {
  LOGGER.info("       ");
 }
}

テスト結果:
2017-05-08 20:49:00.005  INFO 18864 --- [pool-1-thread-1] com.yiyexy.task.Task                     : 今日は日曜日だそうです.
さあ、この穴はここに記録しましょう.最後に、時間は真理を検証する唯一の基準です.
では、Spring Bootタイミングタスクの使用を見てみましょう.
Spring Bootでタイミングタスクをどのように使うかを紹介します.非常に簡単で、あまり説明しません.
次はコードクラスです.

package org.springboot.sample.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
/**
 *        
 *
 * @author    (365384722)
 * @myblog http://blog.csdn.net/catoop/
 * @create 2016 3 21 
 */
@Configuration
@EnableScheduling //       
public class SchedulingConfig {
  private final Logger logger = LoggerFactory.getLogger(getClass());
  @Scheduled(cron = "0/20 * * * * ?") //  20     
  public void scheduler() {
    logger.info(">>>>>>>>>>>>> scheduled ... ");
  }
}

まとめ
以上述べたのは編集者が皆さんに紹介したSpringBootのタイミングタスクが出会った穴で、皆さんに役に立つことを望んでいます.もし皆さんが何か疑問があれば、私にメッセージを送ってください.編集者はすぐに皆さんに返事します.