Springbootはタイミングタスクを持参してCronパラメータを動的に構成する
6498 ワード
, 。
皆さん、今日はSpringBootダイナミック構成Cronパラメータを共有します.シナリオは、バックグラウンド管理インタフェースがタイミングタスクを管理し、実行時間を動的に変更し、ライブラリに保存し、タスクが実行されるたびにライブラリから時間を問合せ、Cronパラメータを動的に変更する効果を達成します.はい、一緒に何が起こっているのか見てみましょう.
1.SpringBootタイミングタスクの4つの実装方法(主)
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依存を追加する必要があります.具体的な使い方については、興味のある人は深く理解することができます.