3.3. 使用 JavaEE 事务客户端
在使用 JavaEE 时,与事务管理器交互的最资金和标准方法是 Java 事务 API(JTA)接口,javax.transaction.UserTransaction
。规范用法是:
InitialContext context = new InitialContext(); UserTransaction ut = (UserTransaction) context.lookup("java:comp/UserTransaction"); ut.begin(); // Access transactional, JTA-aware resources such as database and/or message broker ut.commit(); // or ut.rollback()
从 JNDI(Java 命名与目录接口)获取 UserTransaction
实例是获取事务客户端的一种方式。在 JavaEE 环境中,您可以使用 CDI(上下文和依赖项注入)访问事务客户端。
下图显示了 typica JavaEE Camel 应用。

图显示 Camel 代码和应用程序代码都可以访问:
-
javax.transaction.UserTransaction
实例,使用 SpringTransactionTemplate
类直接从应用程序或内部通过事务感知型 Camel 组件分离交易。 -
直接通过 JDBC API 的数据库,如使用 Spring 的
JdbcTemplate
或使用camel-jdbc
组件。 -
通过 JMS API 的消息代理通过使用 Spring 的
JmsTemplate
类或使用camel-jms
组件来直接通过 JMS API 进行消息代理。
在使用 javax.transaction.UserTransaction
对象时,您不需要清楚使用的实际事务管理器,因为您只与事务客户端直接合作。(请参阅 第 1.3 节 “关于事务客户端”。) Spring 和 Camel 采用不同的方法,因为它在内部使用 Spring 的事务工具。
JavaEE 应用
在典型的 JavaEE 场景中,应用部署到 JavaEE 应用程序服务器,通常是 WAR
或 EAR
存档。通过 JNDI 或 CDI,应用程序可以访问 javax.transaction.UserTransaction
服务的实例。然后,复制使用此事务客户端实例来分离事务。在事务中,应用执行 JDBC 和/或 JMS 访问权限。
Camel 组件和应用程序代码
这些代表执行 JMS/ JDBC 操作的代码。Camel 具有自己的高级方法,可访问 JMS/ JDBC 资源。应用代码可以直接使用给定的 API。
JMS ConnectionFactoryy
这是 javax.jms.ConnectionFactory
接口,用于获取 javax.jms.Connection
的实例,然后在 JMS 2.0 中获取 javax.jms.Session
(或 javax.jms.JmsContext
)。这可以直接由应用程序使用,或在 Camel 组件中间接使用,可在内部使用 org.springframework.jms.core.JmsTemplate
。应用程序代码或 Camel 组件都不需要此连接工厂的详细信息。连接工厂是在应用服务器上配置的。您可以在 JavaEE 服务器中看到此配置。OSGi 服务器(如 Fuse)类似。系统管理员会独立于应用程序配置连接工厂。通常,连接工厂实施池功能。
JDBC 数据源
这是 javax.sql.DataSource
接口,用于获取 java.sql.Connection
的实例。与 JMS 一样,该数据源可以直接或间接使用。例如,camel-sql
组件在内部使用 org.springframework.jdbc.core.JdbcTemplate
类。与 JMS 一样,应用程序代码和 Camel 都不需要此数据源的详细信息。该配置通过使用 第 4 章 配置 Narayana 事务管理器 中描述的方法在应用服务器或 OSGi 服务器内完成。