Как сделать так, чтобы код, запускаемый при запуске, выполнялся первым, до запланированного? - PullRequest
0 голосов
/ 19 мая 2019

У меня есть приложение, которое должно что-то делать при запуске приложения, и только после того, как задача запуска завершена, я хочу выполнить задачу, определенную в функции, помеченной @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 Ответ

1 голос
/ 19 мая 2019

почему бы не использовать более длинный InitialDelay?

Количество миллисекунд для задержки перед первым выполнением

подобно @Scheduled(fixedRate = 5000, initialDelay = 10000)


ИЛИ вы можете: зарегистрировать DataCollector в качестве компонентапосле выполнения первоначального задания.

  • удалить @Configuration из DataCollector
  • переместить @EnableScheduling в AppStartup
  • зарегистрировать DataCollector как компонент после выполнения задачи

результат:

@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
}
...