ホームページ  >  記事  >  Java  >  SpringBootでスケジュールを動的に変更する方法

SpringBootでスケジュールを動的に変更する方法

WBOY
WBOY転載
2023-05-15 20:58:151788ブラウズ

SpringBoot はスケジュールを動的に変更します

シナリオ:

構成可能なスケジュールされた実行時間、通常のスケジュールはプロジェクトの開始時に固定されます。バックグラウンド コード実行の呼び出しに基づいてスケジュールを自動的に更新する方法はありません。 time

例:

システム起動読み取り時間 Cron: 0 0 3 * * ?、Cron 時間形式はバックグラウンド メソッドを実行することで動的に構成でき、元の実行タスクはクリアされ、新しい実行時間が実行可能になります スケジュールされたタスク時間の設定

##1. ThreadPoolTask​​Scheduler および ScheduledFuture クラスに従ってスケジュールされたタスクを動的に変更します (ThreadPoolTask​​Scheduler クラスは @Autowired を使用してメンバー変数を直接定義できません)

private ThreadPoolTaskScheduler threadPoolTaskScheduler;
private ScheduledFuture<?> future;

2. スケジュールされたバックグラウンド メソッドのロジックを動的に変更します (オブジェクトは、Runnable 実装クラスが実行する必要があるタイミング ロジックであり、実行スレッド メソッドに配置されます)

threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.initialize();
if(future!=null){
    future.cancel(true);
}
future=threadPoolTaskScheduler.schedule(object,new CronTrigger("需要Cron时间格式字符串") );

上記ロジック ------- -----動的な Scheduled 構成を実現できます

#次のロジック----- ------------------ 設定項目 DB Cronの自動読み込み開始、タイミング

1、@Orderの設定、CommandLineRunnerクラスのオーバーライドメソッド実行の実装

@Override
    public void run(String... args) throws Exception {
        logger.info("系统启动 默认设置对账任务 时间");
        //获取目前DB 设置的对账时间
        GetBillTimeResp time = systemConfigService.getTime();
        //获取Cron时间格式字符串
        String timeCron = billTimeCronFormat(time.getBillTime());
        logger.info("时间为:"+timeCron);
        //Scheduler 设置每天执行。。。
        threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.initialize();
        future=threadPoolTaskScheduler.schedule(object,new CronTrigger("DB Cron时间格式字符串")); }

SpringBoot プロジェクト @Scheduled で動的パラメータを読み取る

1. @Scheduled の構成可能な開発に基づく

application.propertites: 
read.timer.parmas=0 0/1 * * * *

タイミング クラス:

@Component
public class ScheduledService {
Logger logger= LoggerFactory.getLogger(ScheduledService.class);
    @Scheduled(cron = "${read.timer.parmas}")
    public void readConfigTable(){
        logger.info("*****.read.timer.parmas");
    }
}

スタートアップ クラス:

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

2. コード実装に基づく

(1) コア コード

@Component
@EnableScheduling
public class TestScheduledParams implements SchedulingConfigurer{
    Logger logger= LoggerFactory.getLogger(TestScheduledParams.class);
 
    public static  String DEFAULT_CORN="0/3 * * * * *";
    //##动态传参要给默认值。
    public static String corn=DEFAULT_CORN;
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {     
        taskRegistrar.addTriggerTask(new Runnable() {
            @Override
            public void run() {
               // logger.info("定时任务逻辑");
            }
        }, new Trigger() {
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                //任务触发,可修改任务的执行周期
                CronTrigger cronTrigger = new CronTrigger(corn);
                Date date = cronTrigger.nextExecutionTime(triggerContext);
                return date;
            }
        });
    }
}

(2) 動的なパラメータの割り当てと他のクラスまたはメソッドの割り当て

TestScheduledParams.corn="0/20 * * * * *"

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

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