春ブーツ内でのタスクをスケジュールする方法を知ってもらうために5分

この記事ではGithubのを同期するように更新されました:github.com/Snailclimb / ...、スターを歓迎しました。

私たちは私たちが何かを支援するシステムのための定期的なタスクを確立する必要がある多くの場合、SpringBootは、私たちは良いを達成するために役立っている、私たちは直接使用する必要があり、もちろん、あなたがすることはできませんSpringBootはクォーツの統合が多く、定期的なタスクが付属しています時間も良い選択です。

この記事では、クォーツのコンテンツSpringBoot統合に関連していない、だけSpringBoot自身の実現タイミングタスクを使用する方法を示します。

春のスケジュールは、定期的なタスクを達成するために

私たちは、最も基本的な項目はSpringBootを頼ることができる必要があるので、設定ファイルをそこに掲載されていません。

1.スケジュールされたタスクを作成します。

私たちは、使用@Scheduled注釈は以下のコードをカバーし、簡単にスケジュールされたタスクを作成することができるようになります@Scheduledクーロン式を使用して固定金利の実行、固定遅延実行、初期遅延実行、実行タイミングのタスク:を含む、一般的な使用を。

クーロン式:主にジョブ(スケジュールされたタスク)の実行タイミングの実行時間や頻度を定義する式のために使用されるシステムは、ときに、タスクの実行など、またはクーロンの発現を介して動作し、毎月あなたは、毎日の時間を設定することができ、非常に強力です。

オンラインクロン式ビルダーをお勧めします。cron.qqe2.com/を

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * @author shuang.kou
 */
@Component
public class ScheduledTasks {
    private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    /**
     * fixedRate:固定速率执行。每5秒执行一次。
     */
    @Scheduled(fixedRate = 5000)
    public void reportCurrentTimeWithFixedRate() {
        log.info("Current Thread : {}", Thread.currentThread().getName());
        log.info("Fixed Rate Task : The time is now {}", dateFormat.format(new Date()));
    }

    /**
     * fixedDelay:固定延迟执行。距离上一次调用成功后2秒才执。
     */
    @Scheduled(fixedDelay = 2000)
    public void reportCurrentTimeWithFixedDelay() {
        try {
            TimeUnit.SECONDS.sleep(3);
            log.info("Fixed Delay Task : The time is now {}", dateFormat.format(new Date()));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * initialDelay:初始延迟。任务的第一次执行将延迟5秒,然后将以5秒的固定间隔执行。
     */
    @Scheduled(initialDelay = 5000, fixedRate = 5000)
    public void reportCurrentTimeWithInitialDelay() {
        log.info("Fixed Rate Task with Initial Delay : The time is now {}", dateFormat.format(new Date()));
    }

    /**
     * cron:使用Cron表达式。 每分钟的1,2秒运行
     */
    @Scheduled(cron = "1-2 * * * * ? ")
    public void reportCurrentTimeWithCronExpression() {
        log.info("Cron Expression: The time is now {}", dateFormat.format(new Date()));
    }
}

复制代码

私たちはこのような状況を持っている場合、実際にはfixedRateについては、ここでは、ピットがあります:タイマーを設定する手法の固定金利が5秒ごとに行われます。このメソッドは、次の4つのタスクを実行するために、今では、4つの時間のかかる作業である:6秒、6S、2S、3S、実行する方法(シングルスレッド)、デフォルトでは、これらのタスクを頼みますか?

私たちは、検証するための簡単なプログラムを書きます:

    private static final Logger log = LoggerFactory.getLogger(AsyncScheduledTasks.class);
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
    private List<Integer> index = Arrays.asList(6, 6, 2, 3);
    int i = 0;
    @Scheduled(fixedRate = 5000)
    public void reportCurrentTimeWithFixedRate() {
        if (i == 0) {
            log.info("Start time is {}", dateFormat.format(new Date()));
        }
        if (i < 5) {
            try {
                TimeUnit.SECONDS.sleep(index.get(i));
                log.info("Fixed Rate Task : The time is now {}", dateFormat.format(new Date()));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            i++;
        }
    }
复制代码

プログラムの出力を実行し、次のとおりです。

Start time is 20:58:33
Fixed Rate Task : The time is now 20:58:39
Fixed Rate Task : The time is now 20:58:45
Fixed Rate Task : The time is now 20:58:47
Fixed Rate Task : The time is now 20:58:51
复制代码

タスクの実行を次の図を見てくださいすることは、十分に理解されるべきです。

私たちは、並列に実行するには、この方法を変更した場合、その結果別の話。

2. [スタート]クラス@EnableSchedulingのコメント

SpringBootでは、我々は唯一の起動クラスに追加する必要があり@EnableScheduling、時限タスクを開始することができます。

@SpringBootApplication
@EnableScheduling
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
复制代码

3.カスタム・スレッド・プールには、スケジュールされたタスクを実行します

デフォルトでは、@Scheduled春にタスクの大きさは、追加することにより、次のことができ、デフォルトのスレッド・プール1の実行のために作成@Scheduled検証する注釈付きメソッドに次のコードを追加します。

logger.info("Current Thread : {}", Thread.currentThread().getName());
复制代码

あなたは上記のコードに加えて、各実行の意志の出力の定期的なタスクがあります:

Current Thread : scheduling-1
复制代码

私たちは、カスタム・スレッド・プールを実行する必要がある場合には、唯一の新しい実現追加する必要があるSchedulingConfigurerインターフェイスのconfigureTasksクラスをすることができ、このクラスが追加する必要が@Configuration注釈を。

@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
    private final int POOL_SIZE = 10;

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();

        threadPoolTaskScheduler.setPoolSize(POOL_SIZE);
        threadPoolTaskScheduler.setThreadNamePrefix("my-scheduled-task-pool-");
        threadPoolTaskScheduler.initialize();

        scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
    }
}
复制代码

上記の名前の変更の検証を経て出力電流のスレッド。

4. @EnableAsyncは、タイミングとタスクの並列実行させる@Async

あなたのコードを並列に実行したい場合は、それも可能@EnableAsyncと@ Async2つの音符達成するために

@Component
@EnableAsync
public class AsyncScheduledTasks {
    private static final Logger log = LoggerFactory.getLogger(AsyncScheduledTasks.class);
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    /**
     * fixedDelay:固定延迟执行。距离上一次调用成功后2秒才执。
     */
    //@Async
    @Scheduled(fixedDelay = 2000)
    public void reportCurrentTimeWithFixedDelay() {
        try {
            TimeUnit.SECONDS.sleep(3);
            log.info("Fixed Delay Task : The time is now {}", dateFormat.format(new Date()));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
复制代码

プログラムの出力を実行し、次のように、であるreportCurrentTimeWithFixedDelay()私たちがいることを言ったのでこの方法は、5秒ごとに行われる@Scheduled春のタスクのサイズは、デフォルトのスレッド・プール1の実行のために作成。

Current Thread : scheduling-1
Fixed Delay Task : The time is now 14:24:23
Current Thread : scheduling-1
Fixed Delay Task : The time is now 14:24:28
Current Thread : scheduling-1
Fixed Delay Task : The time is now 14:24:33
复制代码

reportCurrentTimeWithFixedDelay()添加方法@Async以下の注釈付きの出力は、reportCurrentTimeWithFixedDelay()この方法は、2秒ごとに1回実行されます。

Current Thread : task-1
Fixed Delay Task : The time is now 14:27:32
Current Thread : task-2
Fixed Delay Task : The time is now 14:27:34
Current Thread : task-3
Fixed Delay Task : The time is now 14:27:36
复制代码

いいえ公共ありません

あなたは私の記事とドライ共有のリアルタイム更新に注力したい場合は、私の公共の数に焦点を当てることができます。

「Javaのインタビュー攻撃」:「Javaのインタビュー暴行」V2.0のPDF版生まれたこのインタビューのために特別に派生した文書、公開番号返信舞台裏の「Javaのインタビューの電撃」自由を受信します!

Javaのエンジニアは、学習リソースを必要と:一部のJavaエンジニアは、バックグラウンドキーワードが返信番号学ぶために公的資金を使用する「1」の無料無ルーチンを取得しないように。

私の公共の番号

おすすめ

転載: juejin.im/post/5cad53f45188251ace1fe11e