javax.jms.ConnectionFactory 和 javax.jms.XAConnectionFactory 之间的差异

2024-03-16

由于分布式事务的需要,我正在进入 JTA 的世界,并且我不确定之间的区别javax.jms.ConnectionFactory and 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它与两个完美地执行MessageProducer与任一Commit or Rollback.

我不明白的是我怎么会使用javax.jms.XAConnectionFactory.createConnection()方法,我得到一个Session哪个负责这项工作?什么是javax.jms.XAConnectionFactory role?

我还要补充一点,我已经查看了这两个类的源代码(并且javax.jms.BasicConnectionFactory)并且我验证了 XA 类不会覆盖createConnection.


ConnectionFactory 和 XAConnectionFactory 之间的核心区别在于 XAConnectionFactory 创建 XAConnections,而 XAConnections 创建 XASession。 XASessions 代表了真正的区别,因为(引用JMS Java文档 http://download.oracle.com/javaee/1.3/api/javax/jms/XASession.html:)

XASession 接口通过添加对 JMS 提供程序对 Java Transaction API (JTA)(可选)的支持的访问来扩展 Session 的功能。此支持采用 javax.transaction.xa.XAResource 对象的形式。

换句话说,XASession 赋予 XA 实例事务意识。然而,这个特定的实现是可选的,即使对于完全兼容的 JMS 提供者也是如此。来自同一个 JavaDoc:

XAResource 提供了一些相当复杂的工具,用于交错处理多个事务、恢复正在进行的事务列表等。 JTA 感知的 JMS 提供者必须完全实现此功能。这可以通过使用支持 XA 的数据库服务来完成,或者 JMS 提供者可以选择从头开始实现此功能。 应用程序服务器的客户端被给予它认为是常规的 JMS 会话。在幕后,应用程序服务器控制底层 XASession 的事务管理。

换句话说,提供程序可能要求您指定 XA 或非 XA JMS 资源,或者,就像您的情况一样,提供程序可能会使用看似透明的 JTA 管道来执行所有 JTA 管道。常规 JMS 会话.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javax.jms.ConnectionFactory 和 javax.jms.XAConnectionFactory 之间的差异 的相关文章

随机推荐