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