Запустить эфемерное приложение Spring Boot из основного класса или слушателя стартапа? - PullRequest
0 голосов
/ 26 марта 2020

Java 8 и Spring Boot 2.x здесь. Последние несколько лет я использовал Spring Boot для написания веб-приложений и веб-сервисов RESTful, и мне это очень нравится.

Теперь мне нужно написать несколько недолговечных (не обслуживаемых) / daemon) приложения, которые необходимо запустить, выполнить некоторую работу и завершить работу. Точная продолжительность выполнения зависит от рабочей нагрузки, но не более ~ 10 минут. Хотя они не включают хостинг любого серверного HTTP-кода (конечные точки REST, контроллеры и т. Д. c.), Как это делает традиционное веб-приложение / служба, им все же необходимо:

  • Внедрение зависимостей
  • Внешняя конфигурация на основе YAML
  • Аудит
  • Метрики
  • Много других вещей, которые поставляются со склада Spring Boot

Поэтому я не вижу причин, по которым я не могу использовать Spring Boot в качестве базового фреймворка, даже если эти приложения не будут работать в режиме @Controllers или @RestControllers.

В Spring Boot, если вы не указываете никаких контроллеров, он просто запускается и выключается, потому что выполнять нечего. Таким образом, возникает вопрос: куда мне поместить основной код, который нужно выполнить? И вот два логических места, о которых я подумал:

  1. Прямо внутри основного @SpringBootApplication -аннотированного класса, где также определен метод main; или, возможно ...
  2. В реализации ApplicationListener<ContextStartedEvent>

Мне интересно, существует ли здесь подход правильный / неправильный . Наверное, я просто недостаточно знаю жизненный цикл Spring / Boot (и сложный порядок событий, в которых выполняются вещи), чтобы понять, что правильно.

Например, что если Spring Boot требует определенного количество времени для правильного запуска, но я поместил свой код внутри класса, помеченного как основной @SpringBootApplication, и он выполняется за несколько секунд, и предлагает Spring завершить работу, прежде чем он даже правильно завершит полный запуск? Поэтому я думаю, что вопрос сводится к этому, используется ли один:

@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
        new MyApp().run();
    }

    private void run() {
        // put all the app code in here?
    }
}

или , что-то вроде:

@Component
public class StartupListener implements ApplicationListener<ContextStartedEvent> {
    @Override
    public void onApplicationEvent(ContextStartedEvent event) {
        // put all the app code in here?
    }
}

Соображения любого из подходов? Предлагает ли Spring Boot что-то лучшее, чем любое из этих решений, возможно, что-то специально предназначенное для кратковременных / эфемерных приложений?

1 Ответ

0 голосов
/ 07 апреля 2020

Просто повторяйте ответ М. Дейна выше, чтобы я мог пометить его как ответившийся.

Вы можете использовать либо CommandLineRunner, либо ApplicationRunner.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...