spring-boot - 在 Spring Boot+JMS+IBM MQ Durable Topic 监听器中设置 brokerDurSubQueue 属性
问题描述
我正在尝试使用 IBM MQ 主题订阅通过 Spring Boot 应用程序收听消息。
可用信息(由 MQ 管理员提供):
Topic name
Host
Port
QueueManager
BrokerDurableSubscriptionQueue
我正在尝试在 MQConnectionFactory 中设置 BrokerDurableSubscriptionQueue 属性。
我可以找到mqConnectionFactory.setBrokerSubQueue(queueName)
我猜想可以用于非持久订阅。
但我找不到持久订阅的类似属性。
但是我可以看到MQTopic类具有setBrokerDurSubQueue属性,但我不确定在我的情况下如何使用 MQTopic 对象。
我正在使用以下代码:
MQConnectionFactory:
@Bean
public MQTopicConnectionFactory topicConnectionFactory(){
MQTopicConnectionFactory mqTopicConnectionFactory= new MQConnectionFactory();
mqTopicConnectionFactory.setHostName(); //mq host name
mqTopicConnectionFactory.setPort(); // mq port
mqTopicConnectionFactory.setQueueManager(); //mq queue manager
mqTopicConnectionFactory.setChannel(); //mq channel name
mqTopicConnectionFactory.setTransportType(1);
mqTopicConnectionFactory.setSSLCipherSuite(); //tls cipher suite name
return mqTopicConnectionFactory;
}
@Bean
public JmsListenerContainerFactory<?> topicListenerFactory(MQTopicConnectionFactory mqtopicConnectionFactory,
DefaultJmsListenerContainerFactoryConfigurer configurer)
{
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
configurer.configure(factory, mqtopicConnectionFactory);
factory.setPubSubDomain(true);
factory.setSubscriptionDurable(true);
return factory;
}
听众:
@JmsListener(
destination = "someTopic",
subscription = "someTopic",
containerFactory = "topicListenerFactory"
)
public void receiveMessage(String msg) {
repository.save(msg);
}
解决方案
背景:
当您为 IBM MQ 提供特定队列以在您订阅主题时使用时,它称为非托管订阅,因为 MQ 不会管理您提供的底层队列。
如果未提供队列,则称为托管订阅,在这种情况下,MQ 会为您创建一个队列来保存已发布的消息。
如果它是非持久订阅,则创建的队列是一个临时动态队列,其名称如下:
SYSTEM.MANAGED.NDURABLE.<8 hex characters>
如果它是持久订阅,则创建的队列是永久动态队列,其名称如下:
SYSTEM.MANAGED.DURABLE.<8 hex characters>
您发现的是用于 JMS API 的 IBM MQ 类仅支持托管订阅。
建议:
如果您想使用 IBM MQ 的 JMS API 类来接收发布到特定队列上某个主题的消息,我可以建议两个选项:
让 MQ 管理员在队列管理器上设置管理订阅。您可以通过几种不同的方式做到这一点。下面的示例将使用 MQSC 命令。
DEFINE SUB('XYZ') TOPICSTR('SOME/TOPIC') DEST(SOME.QUEUE)
使用用于 Java 的 IBM MQ 类创建一个实用程序应用程序,该应用程序可以打开队列并使用提供的队列创建持久订阅,此应用程序的唯一目的是订阅和取消订阅提供的队列,它不会用于消费任何发布的消息。
对于上述两个选项,您将让 JMS API 应用程序的 IBM MQ 类打开队列以使用已发布的消息,出于所有目的,它不会知道或不需要知道消息已发布到主题。该消息仍将包含 JMS 标头,显示消息发布的主题字符串,因此您可以在需要时查询。如果您愿意,您还可以将多个主题订阅到单个队列。
推荐阅读
- python - 尝试在 Python 中编写时除外
- python - Python Selenium - 提取表中的所有 URL 并迭代直到下一个按钮消失
- dataframe - 合并具有相同列数的两个数据框
- react-native - 在 ReactNav 5 中按下选项卡按钮时重置堆栈导航
- c# - 获取 JSON 中井号 (£) 的值会返回问号 (?)
- python - 意外的 Python 循环行为
- windows - 更改命令以排除子文件夹
- assembly - MOV CX, DAT[4] 索引到字数组 (DW) 的结果
- html - 在图像上叠加图像
- flutter - 无法在 Flutter 中初始化 Inherited 小部件