首页 > 解决方案 > 在 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);

}

标签: spring-bootibm-mqspring-jms

解决方案


背景:

当您为 IBM MQ 提供特定队列以在您订阅主题时使用时,它称为非托管订阅,因为 MQ 不会管理您提供的底层队列。

如果未提供队列,则称为托管订阅,在这种情况下,MQ 会为您创建一个队列来保存已发布的消息。

  • 如果它是非持久订阅,则创建的队列是一个临时动态队列,其名称如下:
    SYSTEM.MANAGED.NDURABLE.<8 hex characters>

  • 如果它是持久订阅,则创建的队列是永久动态队列,其名称如下:
    SYSTEM.MANAGED.DURABLE.<8 hex characters>


您发现的是用于 JMS API 的 IBM MQ 类仅支持托管订阅。


建议:

如果您想使用 IBM MQ 的 JMS API 类来接收发布到特定队列上某个主题的消息,我可以建议两个选项:

  1. 让 MQ 管理员在队列管理器上设置管理订阅。您可以通过几种不同的方式做到这一点。下面的示例将使用 MQSC 命令。

    DEFINE SUB('XYZ') TOPICSTR('SOME/TOPIC') DEST(SOME.QUEUE)

  2. 使用用于 Java 的 IBM MQ 类创建一个实用程序应用程序,该应用程序可以打开队列并使用提供的队列创建持久订阅,此应用程序的唯一目的是订阅和取消订阅提供的队列,它不会用于消费任何发布的消息。

对于上述两个选项,您将让 JMS API 应用程序的 IBM MQ 类打开队列以使用已发布的消息,出于所有目的,它不会知道或不需要知道消息已发布到主题。该消息仍将包含 JMS 标头,显示消息发布的主题字符串,因此您可以在需要时查询。如果您愿意,您还可以将多个主题订阅到单个队列。


推荐阅读