Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 如何在特定CommandLineRunner之后运行计划任务?_Spring_Spring Boot - Fatal编程技术网

Spring 如何在特定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 { //

我在CommandLineRunner的
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();
    }

}