MQQueueConnectionFactory 和 MQXAQueueConnectionFactory 之间的区别

Difference between MQQueueConnectionFactory and MQXAQueueConnectionFactory

如果我只想在 Spring 引导中阅读@JmsListener 的消息,有人可以解释我应该使用 MQXAQueueConnectionFactory 吗?

我用 MQXAQueueConnectionFactory 和 MQQueueConnectionFactory 读取了消息,但我看不出有什么区别。如果我在侦听器方法中做出例外,我会看到该消息一次又一次地传递。

此时,对于 DefaultJmsListenerContainerFactory,setSessionTransacted 设置为 true,setTransactionManager 设置为 null:

public void configure(DefaultJmsListenerContainerFactory factory,
        ConnectionFactory connectionFactory) {
    Assert.notNull(factory, "Factory must not be null");
    Assert.notNull(connectionFactory, "ConnectionFactory must not be null");
    factory.setConnectionFactory(connectionFactory);
    factory.setPubSubDomain(this.jmsProperties.isPubSubDomain());
    if (this.transactionManager != null) {
        factory.setTransactionManager(this.transactionManager); // null
    }
    else {
        factory.setSessionTransacted(true);
    }
    ...

顾名思义,MQXAQueueConnectionFactory 在处理 XA 事务时使用。从技术上讲,MQXAQueueConnectionFactory 实现了 javax.jms.XAConnectionFactory which ultimately provides access to the other XA-related connection, context, session, and resource 接口。通常,这些将由底层框架(例如 Java EE 或 Spring)与事务管理器一起使用,以协调多个资源管理器(例如 JMS 提供程序和 JDBC 之间的 XA 事务数据库)。

由于您不使用 XA 事务,因此您应该只使用 MQQueueConnectionFactory

明确地说,XA 事务不同于事务处理的 JMS 会话(这是您配置的内容)。