我正试图通过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引导应用提供一个特定的队列时,你可以通过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来接收发布到特定队列上的主题的消息,我可以提出两个选择。
让MQ管理员在队列管理器上设置一个管理订阅。 你可以通过几种不同的方式来实现这一点。 下面的例子将使用MQSC命令。
DEFINE SUB('XYZ') TOPICSTR('SOME/TOPIC') DEST(SOME.QUEUE)
使用IBM MQ类为Java创建一个实用程序,它可以打开一个队列,并与所提供的队列创建一个持久的订阅,这个程序的唯一目的是订阅和取消订阅所提供的队列,它不会被用来消费任何发布的消息。
对于上述两个选项,你会让IBM MQ类的JMS API应用打开队列来消费发布的消息,对于所有目的来说,它不会知道或需要知道消息被发布到一个主题。 消息仍然会包含JMS头,显示消息被发布的主题字符串,所以如果需要的话,你可以查询这个。 如果你喜欢,你也可以将多个主题订阅到一个队列中。