首页 > 解决方案 > MQQueueConnectionFactory 和 MQXAQueueConnectionFactory 之间的区别

问题描述

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

我使用 MQXAQueueConnectionFactory 和 MQQueueConnectionFactory 读取消息,但看不出区别。如果我在侦听器方法中出现异常,我会看到该消息一次又一次地传递。

此时 setSessionTransacted 设置为 true,而 DefaultJmsListenerContainerFactory 的 setTransactionManager 设置为空:

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);
    }
    ...

标签: springspring-bootjmsibm-mqspring-jms

解决方案


顾名思义,MQXAQueueConnectionFactory在处理 XA 事务时使用。从技术上讲,MQXAQueueConnectionFactory实现javax.jms.XAConnectionFactory最终提供对其他 XA 相关的连接上下文会话资源接口的访问。通常,这些将由底层框架(例如 Java EE 或 Spring)与事务管理器一起使用,以协调多个资源管理器(例如 JMS 提供程序和 JDBC 数据库)之间的 XA 事务。

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

需要明确的是,XA 事务不同于事务性 JMS 会话(这是您配置的)。


推荐阅读