Я вхожу в мир JTA из-за необходимости распределенных транзакций, и я не уверен относительно различий между javax.jms.ConnectionFactory
и javax.jms.XAConnectionFactory
или, точнее, как получилось, что javax.jms.ConnectionFactory
выполнил то, что ожидал только javax.jms.XAConnectionFactory
может сделать для меня.
Подробности: я использую основы Atomikos в качестве менеджера транзакций, и мое приложение работает на 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
или Rollback
.
Чего я не понимаю, так это как получается, что я использую метод javax.jms.XAConnectionFactory.createConnection()
и получаю Session
, который выполняет эту работу? Какова javax.jms.XAConnectionFactory
роль?
Я также добавлю, что я просмотрел исходный код обоих классов (и javax.jms.BasicConnectionFactory
) и проверил, что класс XA не переопределяет createConnection
.