Запуск скриптов в веб-приложении загрузки Sprint

91
8

У меня есть веб-приложение Spring Boot, упакованное как WAR файл, и я хочу иметь возможность запускать некоторые задачи (скрипты или команды) по требованию. Например:


    Инициализировать схему базы данных
    Выделить базу данных программно
    Перенос данных при необходимости для новых версий приложения (перемещение файлов, операций с базой данных и т.д.).
    Проверка целостности данных между сохраненными файлами и содержимым базы данных

Эти "команды" были бы намного проще реализовать, если бы они имели доступ к тем же beans (сервисам, DAO) и моделям в качестве собственно веб-приложения. Я ожидаю, что мне нужно создать контекст приложения Spring где-то, чтобы это произошло. Я также предпочел бы упаковать эти команды вместе с остальной частью приложения, чтобы они были протестированы вместе с ним и легко развертывались.


По сути, я хочу знать, как достичь чего-то похожего на команды Laravel artisan (PHP).


Я прочитал о запуске класса внутри WAR здесь и здесь. Я ищу "Spring способ" для пакетов и запуска команд. Должен ли я интегрировать Spring пакетные задания для этого? Из того, что я понимаю, Spring Batch предназначен для больших рабочих нагрузок, которые можно разделить несколькими партиями. Должен ли я укусить пулю и поместить команды во второй отдельный модуль maven, который ссылается на первый?


Обновление


Я реализовал ApplicationRunner (спасибо Stefan!), чтобы посмотреть, как они работают, и обнаружил, что они запускаются после приложения Spring контекст обновляется. Это означает, что все веб-приложение инициализируется и активируется до выполнения runner. Сюда входят MVC конечные точки и запланированные задачи, определенные в конфигурациях. Хотя это может быть полезно, мне нужно запускать команды, когда все это неактивно, потому что оно может вступать в конфликт с командами (особенно с состояниями переходных данных во время запуска команд).


обновление 2


Мне просто нужно создать еще одну исполняемую банку, которая создает приложение загрузки Spring с помощью CommandLineRunner. Это может ссылаться на все beans из веб-приложения, если я использую 3 модуля:


    Spring "сервис" beans модуль
    Модуль веб-приложений
    Модуль командной строки командной строки

спросил(а) 2016-09-19T23:02:00+03:00 4 года, 1 месяц назад
1
Решение
82

Вы можете использовать ApplicationRunner
см. spring загрузчик приложений.
Бегуны выполняются после запуска приложения, и у вас есть доступ к контексту spring.

Класс CommandLineRunner используется именно для этого. См. Также Как работает приложение на основе консоли spring для загрузки?

ответил(а) 2016-09-20T00:14:00+03:00 4 года, 1 месяц назад
42

Используя spring данные jpa, вы можете легко достичь этого


1. Разрабатывая классы сущностей, которые представляют вашу схему базы данных и устанавливают свойство spring.jpa.hibernate.ddl-auto = create, схема будет создана для вас при запуске приложения (будьте осторожны, поскольку каждый время, когда вы запускаете схему, будет сброшено и воссоздано для вас)


2 - вы можете включать любые инструкции sql в import.sql, которые должны быть помещены в папку ресурсов с файлом конфигурации (это функция спящего режима, но все еще работает очень хорошо с spring).

инициализировать базу данных с помощью jpa


инициализировать базу данных с помощью спящего режима

ответил(а) 2016-09-20T01:39:00+03:00 4 года, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема