LINUX.ORG.RU

Вспомогательные задачи в Spring-приложении

 ,


0

3

Пишу Spring-приложение: обычный Web-сервер, получает данные из базы — рисует HTML-странички. Возникла необходимость реализации нескольких вспомогательных задач, таких как загрузка данных из дампа базы. Раньше в основном разрабатывал на Ruby on Rails и там для задач использовался rake, например, для миграции базы данных нужно было зайти в проект с приложением и набрать rake db:migrate.

Как нечто похожее принято реализовывать в типовом Java-приложении на Spring? На мой взгляд логично было бы передавать параметры при запуске jar-ки, например, если я запускаю приложение без параметров (java -jar myapp.jar), то поднимается Web-сервер, а если с каким-то параметром (java -jar myapp.jar import-dump db.dump), то запускается вспомогательная задача, отрабатывает и завершает проецсс. Или в Spring-приложениях принято делать как-то по-другому?

java -cp myapp.jar my.main.ClassName

Если у тебя собирается говножарка со спрингобутовыми гадостями, возможно придётся писать java -cp myapp.jar -Dloader.main=my.main.ClassName org.springframework.boot.loader.launch.PropertiesLauncher

В общем направление такое для дальнейших размышлений. Так-то в жаве это тривиально делается, но если её испортить спринг бутом, то всё может стать сложней.

Ну или просто передавай в свой main класс первым параметром то, что хочешь выполнить, а там switch (args[0]) сделай.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 1)

У нас проект базы данных в liquibase, он в отдельном Maven подпроекте, соотевтсвенно запускается миграция из maven

anonymous
()

Правильное решение - использовать отдельные подпроекты в мавен/гредл

Быстрое решение - заиспользовать отдельный спринг профайл, логику описать в сервисе который подымается только при этом профиле.

Fizzika ★★
()

Как нечто похожее принято реализовывать в типовом Java-приложении на Spring?

Можно реализовать нечто похожее при помощи CommandLineRunner https://habr.com/ru/articles/572828/

Ygor ★★★★★
()

для работы с db есть Flyway и Liquibase которые интегрируются с spring

anonymous
()

В чём проблема распарсить параметры командной строки и в зависимости от низ дёргать свой класс для работы или делать SpringApplication.run(MySpringApplication.class, args);

WatchCat ★★★★★
()
Ответ на: комментарий от WatchCat

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

Goganchic ★★
() автор топика
Ответ на: комментарий от WatchCat

Правильно ли я понял идею:

  1. Помечаю конфигурации для общих бинов как @Profile("common").
  2. Помечаю конфигурации, специфичные для cli, как @Profile("cli").
  3. Помечаю конфигурации, специфичные для web worker-ов, как `@Profile(«web»).
  4. При старте приложения проверяю argv и в зависимости от параметров запускаю нужный профиль через SpringApplication.setAdditionalProfiles.

Так?

Goganchic ★★
() автор топика
Ответ на: комментарий от Goganchic

Нет, не через setAdditionalProfiles.

Я бы не заводил профиль «common», а сделал бы @Profile({"cli", "default"}) для общих бинов. Завёл бы application-cli.properties(или yml), в котором прописал бы spring.main.web-application-type=none. И запускал бы через java -Dspring.profiles.active=cli ...

Но это чисто теоретически. Сам никогда такой проблемой не интересовался.

WatchCat ★★★★★
()
Последнее исправление: WatchCat (всего исправлений: 1)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.