【问题标题】:Set brokerDurSubQueue property in Spring Boot+JMS+IBM MQ Durable Topic listener在 Spring Boot+JMS+IBM MQ Durable Topic 监听器中设置 brokerDurSubQueue 属性
【发布时间】:2020-08-20 10:10:58
【问题描述】:

我正在尝试使用 IBM MQ 主题订阅通过 Spring Boot 应用程序监听消息。

可用信息(由 MQ 管理员提供):

Topic name
Host
Port
QueueManager
BrokerDurableSubscriptionQueue

我正在尝试在 MQConnectionFactory 中设置 BrokerDurableSubscriptionQueue 属性。

我可以找到mqConnectionFactory.setBrokerSubQueue(queueName),我猜它可以用于非持久订阅。

但我找不到类似的 Durable 订阅属性。

但是我可以看到 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);

}

【问题讨论】:

  • @JoshMc 感谢您的回复。这很有意义。
  • 我已经清理了我的 cmets 并将所有详细信息添加到我的答案中。

标签: spring-boot ibm-mq spring-jms


【解决方案1】:

背景:

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

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

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

  • 如果是持久订阅,则创建的队列是永久动态队列,名称如下:
    SYSTEM.MANAGED.DURABLE.&lt;8 hex characters&gt;


您发现的是,用于 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 标头,显示消息发布的主题字符串,因此您可以在需要时查询。如果愿意,您还可以将多个主题订阅到单个队列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2021-04-17
    • 2015-04-22
    • 2020-09-29
    • 2017-01-23
    • 2019-11-03
    • 1970-01-01
    相关资源
    最近更新 更多