ホームページ  >  記事  >  Java  >  SpringBoot でスケジュールされたタスク

SpringBoot でスケジュールされたタスク

(*-*)浩
(*-*)浩転載
2019-10-16 16:39:232152ブラウズ

実際の開発プロジェクトのプロセスでは、1 時間ごとに新規登録ユーザーの数を数えたり、毎日午前 1 時にサーバーのキャッシュを消去したり、その数を数えたりするなど、いくつかのことを実行するためにスケジュールされたタスクが必要になることがよくあります。毎週金曜日の購入会員数、ユーザー数等

SpringBoot でスケジュールされたタスク

バージョン 2.0 以降、SpringBoot では、構成ファイルや依存関係を追加せずに、スケジュールされたタスク プログラムを作成するための非常に便利なアノテーション メソッドが提供されています。アノテーションを追加することで、SpringBoot プロジェクトをすばやく構築できます。

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

@EnableScheduling: スケジュールされたタスクのサポートを有効にする

アノテーション メソッド - シングル スレッド

SchedulerTask1 クラスを作成し、以下に保存します。タスク パッケージ:

@Component
public class SchedulerTask1 {

    @Scheduled(cron = "*/6 * * * * ?")
    private void process(){
        System.out.println("SchedulerTask1 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
    }
}

SchedulerTask2 クラスを作成し、タスク パッケージの下に保存します:

@Component
public class SchedulerTask2 {
    @Scheduled(fixedRate  = 3000)
    private void process(){
        System.out.println("SchedulerTask2 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
    }
}

@スケジュールされたパラメーターは 2 つのタイミング設定を受け入れることができます。1 つは一般的に使用される cron="*/6 * * * * ?"、1 つは fixRate = 3000、どちらも X 秒ごとにコンテンツを印刷することを意味します。

fixedRate 説明

@Scheduled(fixedRate = 3000): 最後の実行時点から 3 秒後に実行

@Scheduled(fixedDelay = 3000) : 前回の実行完了時刻から 3 秒後に実行

@Scheduled(initialDelay=1000,fixedRate=6000): 最初の 1 秒の遅延後に実行し、

fixedRate を押す ルール6 秒ごとに実行されます

Cron 式パラメータはそれぞれ次のことを表します:

秒 (0~59) たとえば、0/5 は 5 秒ごとを意味します

分 (0 ~ 59)

時間 (0 ~ 23)

日 (0 ~ 31) 特定の日には、

月 (0 ~ 11) が必要です。計算されます

曜日 (1 ~ 7 または SUN/MON/TUE/WED/THU/FRI/SAT で入力可能)

プロジェクトの開始、実行結果は次のとおりです。

SchedulerTask2 : 21:36:47.795008800
线程 : scheduling-1
SchedulerTask1 : 21:36:48.014888600
线程 : scheduling-1
SchedulerTask2 : 21:36:50.792887400
线程 : scheduling-1
SchedulerTask2 : 21:36:53.792697900
线程 : scheduling-1
SchedulerTask1 : 21:36:54.002684700
线程 : scheduling-1
SchedulerTask2 : 21:36:56.792517700
线程 : scheduling-1
SchedulerTask2 : 21:36:59.792606400
线程 : scheduling-1
SchedulerTask1 : 21:37:00.002598400
线程 : scheduling-1
SchedulerTask2 : 21:37:02.792423300
线程 : scheduling-1
SchedulerTask2 : 21:37:05.802238
线程 : scheduling-1
SchedulerTask1 : 21:37:06.002225200
线程 : scheduling-1

上記の 2 つのスケジュールされたタスクが同時に実行されると、同じスレッド (scheduling-1) が使用され、タスクの実行時間は前のタスクの実行時間の影響を受けます。

アノテーション メソッド - マルチスレッド

新しい MultithreadScheduleTask クラスを作成し、タスク パッケージの下に保存します:

@Component
@EnableAsync
public class MultithreadScheduleTask {

    @Async
    @Scheduled(fixedDelay = 1000)
    public void first() throws InterruptedException {
        System.out.println("第一个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
        Thread.sleep(1000 * 10);
    }

    @Async
    @Scheduled(fixedDelay = 2000)
    public void second() {
        System.out.println("第二个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
        System.out.println();
    }

}

@EnableAsync:マルチスレッドを有効にする

プロジェクトを開始すると、実行結果は次のようになります:

第一个定时任务开始 : 21:48:47.121991300
线程 : task-1
第二个定时任务开始 : 21:48:47.121991300
线程 : task-2

第一个定时任务开始 : 21:48:48.121930600
线程 : task-3
第二个定时任务开始 : 21:48:49.114640
线程 : task-4

第一个定时任务开始 : 21:48:49.114640
线程 : task-5
第一个定时任务开始 : 21:48:50.119792400
线程 : task-6
第二个定时任务开始 : 21:48:51.119726900
线程 : task-7

第一个定时任务开始 : 21:48:51.129727800
线程 : task-8
第一个定时任务开始 : 21:48:52.130157200
线程 : task-2
第二个定时任务开始 : 21:48:53.120096500
线程 : task-4

第一个定时任务开始 : 21:48:53.140095
线程 : task-7
第一个定时任务开始 : 21:48:54.140429600
线程 : task-4
第二个定时任务开始 : 21:48:57.130710
线程 : task-1

以上がSpringBoot でスケジュールされたタスクの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。