在 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:
让 MQ 管理员在 queue 管理器上设置管理订阅。您可以通过几种不同的方式来做到这一点。下面的示例将使用 MQSC 命令。
DEFINE SUB('XYZ') TOPICSTR('SOME/TOPIC') DEST(SOME.QUEUE)
使用 IBM MQ 类 为 Java 创建实用程序应用程序,它可以打开 queue 并使用提供的 queue 创建持久订阅,此应用程序的唯一目的是订阅和取消订阅提供的 queue,它不会用于使用任何已发布的消息。
对于上面的两个选项,您将让 IBM MQ 类 for JMS API 应用程序打开 queue 以使用发布的消息,用于它不知道或不需要的所有目的知道消息已发布到主题。该消息仍将包含 JMS headers,显示发布消息的主题字符串,因此您可以在需要时进行查询。如果愿意,您也可以将多个主题订阅到一个 queue。
我正在尝试使用 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:
让 MQ 管理员在 queue 管理器上设置管理订阅。您可以通过几种不同的方式来做到这一点。下面的示例将使用 MQSC 命令。
DEFINE SUB('XYZ') TOPICSTR('SOME/TOPIC') DEST(SOME.QUEUE)
使用 IBM MQ 类 为 Java 创建实用程序应用程序,它可以打开 queue 并使用提供的 queue 创建持久订阅,此应用程序的唯一目的是订阅和取消订阅提供的 queue,它不会用于使用任何已发布的消息。
对于上面的两个选项,您将让 IBM MQ 类 for JMS API 应用程序打开 queue 以使用发布的消息,用于它不知道或不需要的所有目的知道消息已发布到主题。该消息仍将包含 JMS headers,显示发布消息的主题字符串,因此您可以在需要时进行查询。如果愿意,您也可以将多个主题订阅到一个 queue。