技術共有

SpringBoot 毎日: @Scheduled 実装はサービスの開始時に 1 回実行されます

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


スケジュールされたタスクと言えば、@Scheduled、Quartz、XXL-JOB を思い浮かべる必要がありますが、一部の単一サービスまたは小規模プロジェクトでは、利便性と速度を高めるために @Scheduled を直接使用して非同期タスクを実装する場合があります。したがって、この記事のテーマ要件は拡張されます。

プロジェクト内で @Scheduled を使用する場合、プロジェクト開始時に指定した非同期タスクを事前に実行するにはどうすればよいですか?

1.@Scheduledの詳しい説明

@Scheduled アノテーションは、タスクの実行時間を柔軟に制御するための複数のパラメーターをサポートしています。

  • cron: 秒、分、時間、日、月、週などを正確に制御できる cron 式。
    ここに画像の説明を挿入します
  • ゾーン: アジア/上海などのタイムゾーンを受け取ります。通常、このフィールドは空白のままにします。
  • fixedDelay: 前回の実行完了時刻からどれくらいの時間が経過してから再度実行されるか。 @Scheduled(fixedDelay = 5000) など
  • fixDelayString:fixedDelay と同じ意味を持ちますが、文字列の形式です。唯一の違いは、@Scheduled(fixedDelayString = "5000") などのプレースホルダーをサポートしていることです。
  • fixedRate: 前回の実行開始からの経過時間 (@Scheduled(fixedRate = 5000) など)
  • fixRateString:fixedRate と同じ意味ですが、文字列の形式です。唯一の違いは、プレースホルダーがサポートされていることです。
  • InitialDelay: 初回の実行の遅延時間。たとえば、最初の遅延は実行の 1 秒前です。それ以降は、fixedRate ルールに従って 5 秒ごとに実行されます。 )
  • InitialDelayString:initialDelayString と同じ意味を持ちますが、文字列の形式です。唯一の違いは、プレースホルダーがサポートされていることです。

2. ロジックの実装

1. スケジュールされたタスクのロジック メソッドを作成する

/**
 * @Author 码至终章
 * @Version 1.0
 */
@Component
public class ScheduledTest {

    @Scheduled(cron = "* 1 * * * ?")
    public void task1() throws Exception{
        System.out.println("task1 执行: " + Thread.currentThread() + "-" + DateTime.now());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2. 新しい起動実行クラスを作成する

このクラスは主に起動時に指定されたタスクメソッドを手動で呼び出します。

/**
 * @Author 码至终章
 * @Version 1.0
 */
@Component
public class StartupTasks {

    private final ScheduledTest scheduledTasks;

    public StartupTasks(ScheduledTest scheduledTasks) {
        this.scheduledTasks = scheduledTasks;
    }

    @PostConstruct
    public void startUp() {
        try {
            System.out.println("服务启动执行任务");
            scheduledTasks.task1();
        }catch (Exception e){
			e.printStackTrace();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

注: スケジュールされたタスクが実行されるように、必ず @EnableScheduling をスタートアップ クラスに追加してください。これはこの記事のロジック テストには影響しません。

3. 試験結果

サービス開始後、印刷情報を確認する
ここに画像の説明を挿入します