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

标签 java jms jndi jta atomikos

由于分布式事务的需要,我正在进入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 与 CommitRollback .

我不明白的是我怎么会使用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/

相关文章:

java - 如何从 Java(通过 JNDI)创建一个新的 Active Directory 帐户?

java - 按钮错误viewflipper android

java - 如何发现 List<Integer> 中缺少的渐进算术数在 Java 8 中是什么?

java - 从生成的图像中删除 batik 光栅化 Logo 水印

java - 从 JMS 监听器 onMessage() 提交时,批处理作业卡在 STARTING

java - Tomcat JNDI + 独立 Java

java - 为 Ingres 数据库创建 JNDI 连接

java - JPA + hibernate 环境

jms - ActiveMQ 日志日志大小

java - 将 activiti 消息和信号绑定(bind)到 JMS 消息