簡體   English   中英

如何使在啟動時運行的代碼在計划之前首先執行?

[英]How to make a code that is run on startup execute first, before 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
    }

為什么不使用更長的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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM