【发布时间】:2014-10-05 05:26:42
【问题描述】:
我正在构建一个部署在 WebLogic 中的 Web 应用程序,它还使用许多 OSGi 模块,在我的 Web 应用程序部署期间部署在 WebLogic OSGi (Felix) 中。
根据WebLogic's OSGi documentation,我可以选择在 OSGi 内部公开我在 WebLogic 中创建的任何数据源,以便从我的包中使用它们。因此,我创建了一个数据源并在我的 OSGi 包中使用了 persistence.xml 来查找它并在我的 OSGi 服务中注入(使用蓝图)一个 EntityManager 以使用它。我的 OSGi 包的配置如下所示:
persistence.xml:
<persistence-unit name="mypu" transaction-type="JTA">
<jta-data-source>osgi:service/jdbc/test</jta-data-source>
<class>com.test.impl.model.TestEntity</class>
</persistence-unit>
blueprint.xml
<bean id="TestServiceImpl" class="com.test.impl.TestServiceImpl">
<jpa:context property="em" unitname="mypu" />
<tx:transaction method="*" value="Required" />
</bean>
<service id="TestService" ref="TestServiceImpl"
interface="com.test.api.TestService" />
我还部署了 OSGi Aries 蓝图、Aries JPA、Aries 事务和 OpenJPA。
我的问题是,尽管此配置在我的服务中正确注入了 EntityManager,并且我可以使用它从数据库中读取数据,但它不会围绕我的服务方法创建事务,因此我无法将数据写入数据库。
我知道问题在于 Aries 事务侦听 javax.sql.XADataSource 的实现,然后将其包装在 XADataSourceEnlistingWrapper 中并公开为 javax.sql.DataSource,以便我的包使用。然而,在我的例子中,WebLogic 创建的数据源是 weblogic.jdbc.common.internal.RmiDataSource,它没有实现 javax.sql.XADataSource,所以 Aries 不会选择它。
我对问题的理解正确吗?为了在 WebLogic 的 OSGi 中进行 XA 事务,我需要做什么?
编辑: 我仍然无法在我的 OSGi 包中使用事务,除非我在已经存在的事务中调用 OSGi 服务,从我的 Web 应用程序开始,其中 Web 应用程序还将数据写入数据库。在这种情况下,OSGi 服务被正确地登记在事务中并且数据被持久化。然而,这并不是我的问题的解决方案,因为每次我进行 OSGi 服务调用时,我都无法将数据从我的 Web 应用程序写入数据库。
【问题讨论】:
标签: jpa transactions osgi weblogic weblogic12c