由于需要分布式事务,我正在进入 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);
后来在代码中,我在 a 中使用了这个会话,它在两个带有or 或的 s 中UserTransaction
完美地执行。MessageProducer
Commit
Rollback
我不明白的是,我怎么会使用javax.jms.XAConnectionFactory.createConnection()
方法并且我得到了一个Session
可以完成工作的方法?有什么javax.jms.XAConnectionFactory
作用?
我还要补充一点,我已经查看了两个类(和javax.jms.BasicConnectionFactory
)的源代码,并且我验证了 XA 类不会覆盖createConnection
.