>  기사  >  Java  >  SpringBoot에서 Scheduled를 동적으로 수정하는 방법

SpringBoot에서 Scheduled를 동적으로 수정하는 방법

WBOY
WBOY앞으로
2023-05-15 20:58:151788검색

SpringBoot는 Scheduled를 동적으로 수정합니다

시나리오:

구성 가능한 예약된 실행 시간, 일반 Scheduled는 프로젝트 시작 시 고정되며, 배경 코드 호출을 기반으로 예약된 실행 시간을 자동으로 업데이트할 수 있는 방법이 없습니다

예:

System 시작 읽기 시간 Cron: 0 0 3 * *?, 백그라운드 메서드를 실행하여 Cron 시간 형식을 동적으로 구성하고, 원래 실행 작업을 지우고, 새로 설정된 예약된 작업 시간을 실행할 수 있습니다

1. ThreadPoolTaskScheduler 및 ScheduledFuture 클래스(ThreadPoolTaskScheduler 클래스는 @Autowired를 사용할 수 없으며 멤버 변수를 직접 정의할 수 없음)

private ThreadPoolTaskScheduler threadPoolTaskScheduler;
private ScheduledFuture<?> future;

2 Scheduled 백그라운드 메서드의 논리를 동적으로 수정합니다(객체는 Runnable 구현 클래스가 실행해야 하는 타이밍 논리이며, 실행 스레드 메소드에 넣습니다)

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

위 로직 ----------------------- 다음은 동적 예약 구성

구현할 수 있습니다. logic--------------- -------- 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 프로젝트 @예약된 구성 가능한 개발

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

Timing 클래스:

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

Startup 클래스:

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

2를 기반으로 동적 매개변수 읽기

1이 예약되었습니다. (1) 핵심. code

@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에서 Scheduled를 동적으로 수정하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제