javax.jms.ConnectionFactory和javax.jms.XAConnectionFactory之间的差异 [英] Differences between javax.jms.ConnectionFactory and javax.jms.XAConnectionFactory

查看:424
本文介绍了javax.jms.ConnectionFactory和javax.jms.XAConnectionFactory之间的差异的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

由于需要分布式事务,我正在进入JTA世界,而且我不确定 javax.jms.ConnectionFactory 和<$ c之间的区别$ c> javax.jms.XAConnectionFactory 或更准确地说, javax.jms.ConnectionFactory 是如何执行我所期望的 javax.jms.XAConnectionFactory 可以为我做。

I'm entering the world of JTA, due to need of distributed transactions, and I'm uncertain about the differences between javax.jms.ConnectionFactory and javax.jms.XAConnectionFactory or more accurately how can it be that javax.jms.ConnectionFactory performed what I expected only javax.jms.XAConnectionFactory can do for me.

详细信息:我使用Atomikos essentials作为我的事务管理器和我的应用程序正在Apache Tomcat 6上运行。

The details: I'm using Atomikos essentials as my transaction manager and my app is running on Apache Tomcat 6.

我正在运行一个带有虚拟应用程序的小型POC,我有我的JMS提供程序( OpenMQ )注册为 JNDI 资源。

I'm running a small POC with a dummy app where I have my JMS provider (OpenMQ) registered as a JNDI resource.

<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"/>

奇怪的是,在我的代码中我这样做:

And the strange issue is that in my code I do this:

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 完美无瑕地执行/ code>。

And later in the code I use this session in a UserTransaction and it performs flawlessly with two MessageProducers with either Commit or Rollback.

我不明白的是我如何使用 javax.jms.XAConnectionFactory。 createConnection()方法,我得到一个 Session 哪个可以完成这项工作?什么是 javax.jms.XAConnectionFactory 角色?

What I don't understand is how can it be that I'm using javax.jms.XAConnectionFactory.createConnection() method and I get a Session which does the job? What's javax.jms.XAConnectionFactory role?

我还要补充说我看过源代码这两个类(和 javax.jms.BasicConnectionFactory ),我验证了XA类没有覆盖 createConnection

I'll also add that I've looked at the source code of both classes (and javax.jms.BasicConnectionFactory) and I verified that the XA class does not override createConnection.

推荐答案

ConnectionFactory和XAConnectionFactory之间的区别在于XAConnectionFactory创建了创建XASessions的XAConnections。 XASessions代表了真正的区别,因为(引用 JMS JavaDocs :)

The core of the difference between ConnectionFactory and XAConnectionFactory is that the XAConnectionFactory creates XAConnections which create XASessions. XASessions represent the real difference because (to quote from the JMS JavaDocs:)

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

换句话说,XASession为XA实例提供了事务感知能力。但是,即使对于完全兼容的JMS提供程序,此特定实现也是可选的。来自相同的JavaDoc:

In other words, the XASession is what gives the XA instances their transactional awareness. However, this specific implementation is optional, even for a fully compliant JMS provider. From the same JavaDoc:

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

换句话说,提供程序可能要求您指定XA或非-XA JMS资源,或者,在您的情况下,提供程序可以使用看似常规JMS会话的透明方式执行所有JTA管道。

In other words, the provider may require that you specify an XA or non-XA JMS resource, or, as would seem to be in your case, the provider may perform all the JTA plumbing transparently with what appears to be a regular JMS Session.

这篇关于javax.jms.ConnectionFactory和javax.jms.XAConnectionFactory之间的差异的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆