Springbootはタイミングタスクを持参してCronパラメータを動的に構成する

6498 ワード

, 。
皆さん、今日はSpringBootダイナミック構成Cronパラメータを共有します.シナリオは、バックグラウンド管理インタフェースがタイミングタスクを管理し、実行時間を動的に変更し、ライブラリに保存し、タスクが実行されるたびにライブラリから時間を問合せ、Cronパラメータを動的に変更する効果を達成します.はい、一緒に何が起こっているのか見てみましょう.
1.SpringBootタイミングタスクの4つの実装方法(主)
  • Timer:java.util.Timerクラスです.java.util.TimerTaskタスクをスケジュールできます.この方法では、プログラムをある頻度で実行できますが、指定された時間に実行できません.一般的には少ないです.
  • ScheduledExecutorService:jdkが持っているクラスでもあります.スレッドプールに基づいて設計されたタイミングタスククラスであり、各スケジューリングタスクはスレッドプールのスレッドに割り当てられて実行されます.つまり、タスクは同時実行であり、互いに影響しません.
  • Spring Task:Spring 3.0以降に持参したtaskは、軽量級のQuartzと見なすことができ、Quartzよりも簡単に使用できます.
  • Quartz:これは比較的強力なスケジューラで、あなたのプログラムを指定の時間に実行させることができて、ある頻度によって実行することができて、配置は少し複雑です.

  • 1.1 Timerの使用
    これは、一定の頻度でタスクを実行させ、時間を指定することはできません.
    public class TestTimer {
        public static void main(String[] args) {
            TimerTask timerTask = new TimerTask() {
                @Override
                public void run() {
                    System.out.println("task  run:"+ new Date());
                }
            };
            Timer timer = new Timer();
            //                          。    3     
            timer.schedule(timerTask,10,3000);
        }
    }

    1.2 ScheduledExecutorServiceの使用
    timerに似ている
    public class TestScheduledExecutorService {
        public static void main(String[] args) {
            ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
            //   :1、    2、         
            //      3、       4、      
            service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()), 0, 3, TimeUnit.SECONDS);
        }
    }

    1.3 Spring Taskの使用
    主にその動的構成の使用方法について説明します.
    使い始めたばかりの頃、私たちは1つのタスクの実行時間を変更しました.一般的には、タイミングタスクの実行周期を変更し、サービスを停止し、タスクのcronパラメータを変更し、サービスを再起動すれば終わります.この方式は簡単で、言うことはありませんが、サービスを停止しない場合、タスクのcronパラメータを動的に変更できる可能性はありますか?それは必須です!先ほど述べた方法では、メインクラスに@EnableScheduling注記を付け、タスクメソッドの前に@Scheduled(cron="0/5******)注記を付けて実行時間を定義しましたが、動的構成の手順は少し違います.
    1. @EnabledScheduling , SchedulingConfigurer 。
    2. cron, 。
    3. Cron , 。
    4. , 。
    import java.util.Date;
    
    import org.springframework.scheduling.Trigger;
    import org.springframework.scheduling.TriggerContext;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.scheduling.annotation.SchedulingConfigurer;
    import org.springframework.scheduling.config.ScheduledTaskRegistrar;
    import org.springframework.scheduling.support.CronTrigger;
    import org.springframework.stereotype.Component;
    import java.time.LocalDateTime;
    
    @Component 
    @EnableScheduling
    public class TaskCronChange implements  SchedulingConfigurer{
    
        public static String cron; 
    
        @Override
        public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
            //     ,        ,      cron   
            cron = timerQueryMapper.getCronTime();
    
           Runnable task = new Runnable() {
               @Override
               public void run() {
                  //        .
                  System.out.println("I am going:" + LocalDateTime.now());
               }
           };
           Trigger trigger = new Trigger() {
               @Override
               public Date nextExecutionTime(TriggerContext triggerContext) {
                  //    ,          .
                  //       ,           ,                    
                  cron = timerQueryMapper.getCronTime();
                  CronTrigger trigger = new CronTrigger(cron);
                  Date nextExec = trigger.nextExecutionTime(triggerContext);
                  return nextExec;
               }
           };
           taskRegistrar.addTriggerTask(task, trigger);
        }
    
    }

    タスクが一度実行されるときに時間のcron式を変更するので、cronを変更すると、次のタスクが実行されるときに有効になります.ここでは主にScheduledTaskRegistrarというクラスにaddTriggerTask(Runnable,Trigger)という2つのパラメータを使用しています.1つはTriggerです.1つはTriggerです.Runnableでビジネスロジックコードを実行し、Triggerでタイミングタスクの実行サイクルを変更します.
    1.4 Quartzの統合
    SpringBootバージョンが2.0.0以降の場合、spring-boot-starterにquart依存が含まれている場合はspring-boot-starter-quartz依存を直接使用できますが、2.0.0未満の場合はquartz依存を追加する必要があります.具体的な使い方については、興味のある人は深く理解することができます.