如何使在启动时运行的代码在计划之前首先执行?

时间:2019-05-19 11:52:15

标签: java spring spring-boot spring-scheduled

我有一个应用程序,它必须在应用程序启动时执行某些操作,并且仅在启动任务完成后,我才想执行@Scheduled注释的函数中定义的任务。 当前的问题是@Scheduled中定义的任务在启动时先执行。

我通过插入以下命令达到了预期的效果

Thread.sleep(100);

但是,我觉得它充其量只是一个幼稚的解决方案,我想知道是否有一个优雅的解决方案来解决这个问题。

AppStartup.java:

@Component
public class AppStartup implements ApplicationListener<ApplicationReadyEvent> {

    @Override
    public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
        System.out.println("On startup");
    }
}

DataCollector.java:

@Configuration
@EnableScheduling
public class DataCollector {

    @Scheduled(fixedRate = 5000)
    public void executeTask() {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // do sth
    }

1 个答案:

答案 0 :(得分:1)

为什么不使用更长的initialDelay?

  

第一次执行之前要延迟的毫秒数

@Scheduled(fixedRate = 5000, initialDelay = 10000)


或者您可以:在执行初始任务后将DataCollector注册为bean。

  • 从DataCollector中删除@Configuration
  • @EnableScheduling移至AppStartup
  • 在执行任务后将DataCollector注册为bean

结果:

@Component

public class AppStartup implements ApplicationListener<ApplicationReadyEvent> {

    @Override
    public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
        System.out.println("On startup");
        /* task execution */

        // register DataCollector
        applicationReadyEvent
             .getApplicationContext()
             .getBeanFactory()
             .createBean(DataCollector.class);
    }
}


public class DataCollector {

    @Scheduled(fixedRate = 5000)
    public void executeTask() {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // do sth
}