由于分布式事务的需要,我正在进入JTA的世界,并且我不确定javax.jms.ConnectionFactory
之间的差异和javax.jms.XAConnectionFactory
或者更准确地说,怎么会是 javax.jms.ConnectionFactory
仅执行了我的预期javax.jms.XAConnectionFactory
可以为我做。
详细信息:我使用 Atomikos Essentials 作为我的事务管理器,并且我的应用程序在 Apache Tomcat 6 上运行。
我正在使用一个虚拟应用程序运行一个小型 POC,其中我将 JMS 提供程序 ( OpenMQ
) 注册为 JNDI
资源。
<Resource name="jms/myConnectionFactory" auth="Container"
type="com.atomikos.jms.AtomikosConnectionFactoryBean"
factory="com.atomikos.tomcat.EnhancedTomcatAtomikosBeanFactory"
uniqueResourceName="jms/myConnectionFactory"
xaConnectionFactoryClassName="com.sun.messaging.XAConnectionFactory"
maxPoolSize="3"/>
奇怪的问题是,在我的代码中我这样做:
Context ctx = new InitialContext();
ConnectionFactory queueConnectionFactory =
(ConnectionFactory)ctx.lookup("java:comp/env/jms/myQueueFactory");
javax.jms.Connection connection = queueConnectionFactory.createConnection();
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
稍后在代码中我在 UserTransaction
中使用此 session 它与两个 MessageProducer
完美配合s 与 Commit
或Rollback
.
我不明白的是我怎么会使用javax.jms.XAConnectionFactory.createConnection()
方法,我得到 Session
哪个负责这项工作?什么是 javax.jms.XAConnectionFactory
角色?
我还要补充一点,我已经查看了这两个类(和 javax.jms.BasicConnectionFactory
)的源代码,并且我验证了 XA 类不会覆盖 createConnection
。 .
最佳答案
ConnectionFactory 和 XAConnectionFactory 之间的核心区别在于 XAConnectionFactory 创建 XAConnections,而 XAConnections 创建 XASession。 XASessions 代表了真正的差异,因为(引用 JMS JavaDocs :)
XASession 接口(interface)通过添加对 JMS 提供程序对 Java Transaction API (JTA)(可选)的支持的访问来扩展 Session 的功能。此支持采用 javax.transaction.xa.XAResource 对象的形式。
换句话来说,XASession 赋予 XA 实例事务意识。然而,这个特定的实现是可选的,即使对于完全兼容的 JMS 提供者也是如此。来自同一个 JavaDoc:
XAResource 提供了一些相当复杂的工具,用于交错处理多个事务、恢复正在进行的事务列表等。 JTA 感知的 JMS 提供者必须完全实现此功能。这可以通过使用支持 XA 的数据库服务来完成,或者 JMS 提供者可以选择从头开始实现此功能。 应用程序服务器的客户端被给予它认为是常规的 JMS session 。在幕后,应用服务器控制着底层XASession的事务管理。
换句话说,提供程序可能要求您指定 XA 或非 XA JMS 资源,或者,正如您的情况一样,提供程序可能会使用看似 < 的内容透明地执行所有 JTA 管道操作。 em>常规 JMS session 。
关于java - javax.jms.ConnectionFactory 和 javax.jms.XAConnectionFactory 之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4117628/