我想集成一个Liquibase到我的项目。我的第一个想法是使用蓝图的bean,从onInit方法启动Liquibase更新。但是hibernate有一个问题,因为我们有"hbm2ddl"。auto"设置为"validate",验证在bean的onInit之前执行。(我们在META-INF中通过persistence.xml使用容器管理的持久性)。所以我的第二次尝试是使用BundleTracker,当manifest中存在一些条目时,liquidbase执行db更新。它工作得很好,但我想强制bundle不会启动,如果数据库的更新不会成功。但我不知道如何从BundleTracker方法addBundle中实现。有没有办法防止从BundleTracker事件启动bundle ?
我有另一个可能的想法来做它创建一些附加的bundle来执行更新和其他bundle with persistence.xml将依赖于这个bundle。但是我们有很多使用persistence.xml的捆绑包,这就是为什么我认为使用BundleTracker的解决方案更好。
您可以使用最新的pax-jdbc-config来完成此任务。它从配置中提供DataSource服务。因此,这本身就是一个有用的抽象。
最新版本现在包含一个称为PreHook的功能。基本上,您实现了一个OSGi服务,该服务实现了PreHook接口,并使用name属性发布它。在DataSource配置中,您可以通过其名称引用该服务。当DataSource被创建时,这个服务在DataSource被发布给其他bundle使用之前被调用。因此,在PreHook中,你可以使用liquidbase来处理数据库,而基于hibernate的bundle只有在数据库处于新状态时才会看到数据源。
参见PreHook的集成测试。
在几乎所有情况下,这些类型的依赖都应该建模为服务。启动/停止bundle可能听起来很容易,但随着时间的推移会让你陷入可怕的泥潭。
一旦动态依赖项是一个服务,OSGi中的所有部分(尤其是声明性服务)都会使其动态工作变得微不足道。不仅在"快乐"的情况下,而且在许多方面,这些事情都可能导致错误。
所以在你的情况下,你创建了一个LiquibaseHappy服务或其他东西,并且使用db的bundle应该依赖于它