3.5. OSGi 在事务客户端和事务管理器间的接口

在有关 JavaEE 事务客户端 API 和 Spring Boot 事务客户端 API 的描述后,可以看到 OSGi 服务器(如 Fuse)中的关系。OSGi 的其中一个特性是全球服务 registry,可用于:

  • 通过过滤或接口查找服务。
  • 使用给定接口和属性注册服务。

与在 JavaEE 应用程序服务器中部署的应用程序一样,使用 JNDI(服务 定位方法)或由 CDI(依赖项注入 方法)获取对 javax.transaction.UserTransaction 的引用一样,您可以在以下位置获取相同的引用(直接或间接):

  • 调用 org.osgi.framework.BundleContext.getServiceReference() 方法(服务 locator)。
  • 并将它们注入到 Blueprint 容器中。
  • 使用 Service Component Runtime(SCR)注解(依赖项注入)。

下图显示了在 OSGi 运行时部署的 Fuse 应用程序。应用程序代码和/或 Camel 组件使用其 API 获取事务管理器、数据源和连接因素的引用。

OSGi 事务架构

应用程序(bundle)与在 OSGi 注册表中注册的服务交互。访问通过 接口 来执行,这都应当与应用程序相关。

在 Fuse 中,实现(直接或通过小包装器)交易客户端接口的基本对象是 org.jboss.narayana.osgi.jta.internal.OsgiTransactionManager。您可以使用以下接口访问事务管理器:

  • javax.transaction.TransactionManager
  • javax.transaction.UserTransaction
  • org.springframework.transaction.PlatformTransactionManager
  • org.ops4j.pax.transx.tm.TransactionManager

您可以直接使用任何这些接口,或通过选择 Camel 等框架或库来隐式使用它们。

有关在 Fuse 中配置 org.jboss.narayana.osgi.jta.internal.OsgiTransactionManager 的方法,请参考 第 4 章 配置 Narayana 事务管理器。本指南中的后续章节会基于本章中的信息构建,并描述如何配置和使用其他服务,如 JDBC 数据源和 JMS 连接工厂。