Spring 如何在特定CommandLineRunner之后运行计划任务?
我在CommandLineRunner的Spring 如何在特定CommandLineRunner之后运行计划任务?,spring,spring-boot,Spring,Spring Boot,我在CommandLineRunner的run函数中进行了一些初始化,我希望我的Scheduled任务在初始化后开始计划,我如何实现这一点? 例如,我有CommandLineRunner: @Component public class MyCommandLineRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { //
run
函数中进行了一些初始化,我希望我的Scheduled
任务在初始化后开始计划,我如何实现这一点?例如,我有CommandLineRunner:
@Component
public class MyCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
// Initializations
// ...
}
}
和任务计划程序:
public class SchedClass {
@Scheduled(fixedRate = ONE_SECOND)
public void sched() {
}
}
在运行run()
之后,如何使sched()
运行?1)添加@EnableScheduling
@EnableScheduling
@SpringBootApplication
public class MyCommandLineRunner implements CommandLineRunner {
...
}
2) 用@组件
已更新
它可以手动实现。提供TaskScheduler
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler(){
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(5);
threadPoolTaskScheduler.setThreadNamePrefix("ThreadPoolTaskScheduler");
return threadPoolTaskScheduler;
}
将其与SchedClass一起注入MyCommandLineRunner
并运行
@Component
public class MyCommandLineRunner implements CommandLineRunner {
@Autowired
private ThreadPoolTaskScheduler taskScheduler;
@Autowired
private SchedClass schedBean;
@Override
public void run(String... args) throws Exception {
// ...
taskScheduler.scheduleWithFixedDelay(() -> schedBean.sched(), ONE_SECOND);
// ...
}
}
我的@EnableScheduling
和@SpringBootApplication
注释被添加到具有主要功能的应用程序类中。MyCommandLineRunner
用@Component
注释,这使它成为一个bean并启动。@hello.wjx好的,我错过了。认为你的跑步者是独立的application@hello.wjx更新了我的答案,当它使用ThreadPoolTaskScheduler
而不是spring boot的调度框架进行调度时,它可能对您有用。如果调度函数需要等待所有的CommandLineRunner
呢?如果调度函数需要等待所有的CommandLineRunner
,而不是一个呢?一种方法是创建一个优先级较低的CommandLineRunner
类并调用schedulingConfigurer.resume()代码>从那里开始。用@Order(Integer.MAX_VALUE)
注释优先级较低的运行程序类。另一种方法是编写一个函数,该函数正在侦听ApplicationReadyEvent
事件,并在此方法中调用schedulingConfigurer.resume()
。当所有CommandLineRunner
和ApplicationArguments
类完成时,将触发就绪事件。我更新了代码,以侦听在所有CommandLineRunner
和ApplicationArguments
执行后将触发的ApplicationReadyEvent
。
class MySchedulingConfigurer implements SchedulingConfigurer {
private ScheduledTaskRegistrar taskRegistrar;
private IntervalTask task;
public MySchedulingConfigurer(IntervalTask task) {
this.task = task;
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
this.taskRegistrar = taskRegistrar;
}
public void resume() {
this.taskRegistrar.scheduleFixedRateTask(task);
}
}
@Configuration
class SchedulerConfiguration {
@Autowired
private MySchedulingConfigurer schedulingConfigurer;
@Bean
public MySchedulingConfigurer mySchedulingConfigurer() {
IntervalTask task = new IntervalTask(new MyTask(), 5000L);
return new MySchedulingConfigurer(task);
}
public static class MyTask implements Runnable {
@Override
public void run() {
System.out.println("===> task executed...");
}
}
@EventListener
public void startScheduler(ApplicationReadyEvent event){
schedulingConfigurer.resume();
}
}
@Component
class CacheLoadingRunner implements CommandLineRunner {
@Autowired
private MySchedulingConfigurer schedulingConfigurer;
@Override
public void run(String... args) throws Exception {
schedulingConfigurer.resume();
}
}