在Spring Boot+JMS+IBM MQ耐用主题监听器中设置brokerDurSubQueue属性。

问题描述 投票:1回答:1

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

可用信息(由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;

}

Listener:

@JmsListener(
destination = "someTopic",
subscription = "someTopic",
containerFactory = "topicListenerFactory" 
)

public void receiveMessage(String msg) {

repository.save(msg);

}

spring-boot ibm-mq spring-jms
1个回答
0
投票

背景:当你为Spring引导应用提供一个特定的队列时,你可以通过Spring引导应用使用IBM MQ主题订阅。

当你提供一个特定的队列让IBM MQ在你订阅一个主题时使用时,它被称为未管理的订阅,因为MQ在你提供队列后就不管理底层队列了。

当没有提供队列时,它被称为管理型订阅,在这种情况下,MQ为你创建了一个队列来保存发布的消息。

  • 如果是一个非持久订阅,创建的队列是一个临时的动态队列,名字就像。SYSTEM.MANAGED.NDURABLE.<8 hex characters>

  • 如果它是一个持久的订阅,创建的队列是一个永久的动态队列,名字就像: SYSTEM.MANAGED.DURABLE.<8 hex characters>


你所发现的是,IBM MQ类的JMS API只支持托管订阅。


建议。

如果你想使用IBM MQ classes for JMS API来接收发布到特定队列上的主题的消息,我可以提出两个选择。

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

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

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

对于上述两个选项,你会让IBM MQ类的JMS API应用打开队列来消费发布的消息,对于所有目的来说,它不会知道或需要知道消息被发布到一个主题。 消息仍然会包含JMS头,显示消息被发布的主题字符串,所以如果需要的话,你可以查询这个。 如果你喜欢,你也可以将多个主题订阅到一个队列中。

© www.soinside.com 2019 - 2024. All rights reserved.