Использование Liquibase с OSGI и Hibernate

Я хотел бы интегрировать Liquibase в свой проект. Моей первой идеей было использовать bean-компонент blueprint, который запускает обновление Liquibase из метода onInit. Но была проблема со спящим режимом, потому что у нас для «hbm2ddl.auto» установлено значение «validate», и проверка была выполнена до того, как мой bean-компонент onInit. (мы используем персистентность, управляемую контейнером, с persistence.xml в META-INF). Итак, моя вторая попытка состояла в том, чтобы использовать BundleTracker, и когда какая-то запись в манифесте существует, liquibase выполняет обновление базы данных. Он работает хорошо, но я хотел бы, чтобы пакет не запускался, если обновление базы данных не будет успешным. Но я понятия не имею, как это сделать из метода BundleTracker addBundle. Есть ли способ предотвратить запуск пакета из события BundleTracker?

У меня есть еще одна возможная идея сделать это, чтобы создать дополнительный пакет, который выполняет обновление, а другой пакет с persistence.xml будет зависеть от этого пакета. Но у нас много бандлов с persistence.xml, поэтому решение с BundleTracker мне кажется лучше.


person jherkel    schedule 17.11.2016    source источник
comment
Я действительно застрял с liquibase osgi и интеграцией гибернации, я вижу, что вы уже нашли способ, так что вы можете помочь мне с этим? потому что я хочу вызвать liquibase diff между моей единицей персистентности и моей базой данных в качестве службы в пакете osgi, но я не могу этого сделать   -  person elpazio    schedule 16.02.2017
comment
Мы делаем diff через плагин maven, но у нас есть пакет osgi, который может обновлять базу данных, используя liquibase и чистый источник данных. С спящим режимом у нас была проблема с валидацией, потому что он был выполнен до нашего обновления liquibase. Я думаю, что с помощью BundleActivator вы можете выполнить обновление до активации гибернации, но мы выбрали другое решение.   -  person jherkel    schedule 26.02.2017


Ответы (2)


Почти во всех случаях такие зависимости следует моделировать как сервисы. Запуск/остановка пакетов может показаться простым, но со временем вы попадете в ужасно отвратительное болото.

Как только динамическая зависимость становится сервисом, все части OSGi (особенно декларативные сервисы) упрощают работу с его динамикой. Не только в «счастливых» случаях, но и во многих случаях, когда эти вещи могут вызывать ошибки.

Итак, в вашем случае вы создаете службу LiquibaseHappy или что-то в этом роде, и пакеты, использующие базу данных, должны зависеть от нее.

person Peter Kriens    schedule 17.11.2016

Возможно, вы сможете использовать новейшую версию pax-jdbc-config для этой задачи. Он предоставляет службу DataSource из конфигурации. Так что это само по себе уже полезная абстракция.

Новейшая версия теперь содержит функцию под названием PreHook. По сути, вы реализуете службу OSGi, которая реализует интерфейс PreHook и опубликуйте его со свойством name. В вашей конфигурации DataSource вы можете ссылаться на эту службу по ее имени. Когда DataSource создается, эта служба вызывается перед публикацией DataSource для использования другими пакетами. Таким образом, внутри PreHook вы можете работать с базой данных, используя liquibase, а пакет на основе гибернации будет видеть источник данных только тогда, когда база данных находится в новом состоянии.

В качестве примера см. также интеграционный тест для PreHook.

person Christian Schneider    schedule 31.03.2017