spring - 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);
}
...
解决方案
顾名思义,MQXAQueueConnectionFactory
在处理 XA 事务时使用。从技术上讲,MQXAQueueConnectionFactory
实现javax.jms.XAConnectionFactory
最终提供对其他 XA 相关的连接、上下文、会话和资源接口的访问。通常,这些将由底层框架(例如 Java EE 或 Spring)与事务管理器一起使用,以协调多个资源管理器(例如 JMS 提供程序和 JDBC 数据库)之间的 XA 事务。
由于您不使用 XA 事务,因此您应该只使用MQQueueConnectionFactory
.
需要明确的是,XA 事务不同于事务性 JMS 会话(这是您配置的)。
推荐阅读
- azure-cosmosdb - IDocumentQuery.ExecuteNextAsync() 的问题
- mysql - 带有 REGEXP 的 MySQL CASE 语句不起作用
- angular - 打字稿错误 TS1005: '(' 预期
- python - 使用python将md5哈希转换为png文件
- swift - 如何在 Swift 中的每个第 n 个字符处拆分一个字符串?
- php - Laravel:图片未上传
- linux - 为什么mplayer在循环时退出Bash?
- selenium - 量角器以离线模式安装 - webdriver-manager 启动错误 - 我在做什么错
- spring - Spring Boot WebSecurityConfigurerAdapter - 如果输入登录 URL,则重定向
- reporting-services - 如何在 ssrs 报告中生成序列号