Java 8 и Spring Boot 2.x здесь. Последние несколько лет я использовал Spring Boot для написания веб-приложений и веб-сервисов RESTful, и мне это очень нравится.
Теперь мне нужно написать несколько недолговечных (не обслуживаемых) / daemon) приложения, которые необходимо запустить, выполнить некоторую работу и завершить работу. Точная продолжительность выполнения зависит от рабочей нагрузки, но не более ~ 10 минут. Хотя они не включают хостинг любого серверного HTTP-кода (конечные точки REST, контроллеры и т. Д. c.), Как это делает традиционное веб-приложение / служба, им все же необходимо:
- Внедрение зависимостей
- Внешняя конфигурация на основе YAML
- Аудит
- Метрики
- Много других вещей, которые поставляются со склада Spring Boot
Поэтому я не вижу причин, по которым я не могу использовать Spring Boot в качестве базового фреймворка, даже если эти приложения не будут работать в режиме @Controllers
или @RestControllers
.
В Spring Boot, если вы не указываете никаких контроллеров, он просто запускается и выключается, потому что выполнять нечего. Таким образом, возникает вопрос: куда мне поместить основной код, который нужно выполнить? И вот два логических места, о которых я подумал:
- Прямо внутри основного
@SpringBootApplication
-аннотированного класса, где также определен метод main
; или, возможно ... - В реализации
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 что-то лучшее, чем любое из этих решений, возможно, что-то специально предназначенное для кратковременных / эфемерных приложений?