Spring запускается после запуска - PullRequest
0 голосов
/ 30 сентября 2019

Я запускаю spring веб-приложение (не spring boot). При запуске приложение запрашивает набор данных с другого сервера. Этот набор данных занимает около минуты для обработки. Когда я развертываю это приложение на коте, это занимает минуту. Сам веб-сайт не будет доступен, пока запрос набора данных не будет полностью обработан. Но на самом деле я хотел бы видеть, что пользователи уже могут войти в систему, и набор данных обрабатывается без остановки работы остальной части приложения.

В настоящее время у меня есть класс обслуживания и я использую аннотацию @PostConstruct. .

@Service
public class StartupService {
  @PostConstruct
  public void load() {
    //perform the dataset request
    ...
  }
}

Я нашел здесь похожую статью о stackoverflow, в которой предлагалось попробовать ApplicationListener. Но это имеет тот же эффект. HTTP-запросы на веб-сайт не отвечают, если запрос набора данных не завершен.

@Service
public class StartupService implements ApplicationListener<ContextRefreshedEvent> {
  @Override
  public void onApplicationEvent(final ContextRefreshedEvent event) {
    //perform the dataset request
    ...
  }
}

Конечно, можно было бы начать новый Thread, но я хотел бы знать, какой подход лучшедля этой проблемы будет.

1 Ответ

1 голос
/ 30 сентября 2019

Из PostConstruct doc:

... Этот метод ДОЛЖЕН быть вызван до ввода класса в эксплуатацию ...

Поэтому Spring не может обслуживать запрос, пока не завершится метод @PostContruct.

Как вы предложили, запустите новый поток вручную или:

  • из метода @PostConstruct, вызовите открытый методв другом компоненте, аннотированном @Async, и Spring будет асинхронно вызывать метод, который позволит методу @PostConstruct немедленно завершить работу и начать обслуживание запросов
  • из метода @PostConstruct, @Schedule одноразовой задачи - например, 1через минуту

См. также: @EnableAsync и / или @ EnableScheduling

...