在 Spring 中设置 brokerDurSubQueue 属性 Boot+JMS+IBM MQ 持久主题侦听器

Set brokerDurSubQueue property in Spring Boot+JMS+IBM MQ Durable Topic listener

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

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

Topic name
Host
Port
QueueManager
BrokerDurableSubscriptionQueue

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

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

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

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

}

背景:

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

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

  • 如果它是一个 non-durable 订阅,queue 创建的是一个临时动态 queue,名称如下:
    SYSTEM.MANAGED.NDURABLE.<8 hex characters>

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


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


建议:

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

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

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

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

对于上面的两个选项,您将让 IBM MQ 类 for JMS API 应用程序打开 queue 以使用发布的消息,用于它不知道或不需要的所有目的知道消息已发布到主题。该消息仍将包含 JMS headers,显示发布消息的主题字符串,因此您可以在需要时进行查询。如果愿意,您也可以将多个主题订阅到一个 queue。