问题描述
我正在尝试使用 JMS 在 Azure 服务总线上创建非持久主题订阅。此功能最近可用于高级服务总线层。
我正在使用 Spring Boot 和 Spring JMS,并且我使用 @JmsListener
订阅了该主题。我设法使用 Azure 库使其工作,但 Spring 等效项不起作用。
如果我使用 azure-servicebus-jms
依赖项并使用 ServiceBusJmsConnectionFactory
设置我的侦听器,如下例所示,它可以正常工作并动态创建对该主题的非持久、非共享订阅(我想要):
使用 ServiceBusJmsConnectionFactory
@Bean
public ConnectionFactory connectionFactory() {
ServiceBusJmsConnectionFactorySettings connectionFactorySettings = new ServiceBusJmsConnectionFactorySettings();
connectionFactorySettings.setConnectionIdleTimeoutMS(20000);
return new ServiceBusJmsConnectionFactory("[CONN-STRING]",connectionFactorySettings);
}
@Bean
public JmsListenerContainerFactory containerFactory(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setSubscriptionDurable(false);
factory.setPubSubDomain(true);
return factory;
}
@JmsListener(destination = "mytopicName",containerFactory = "containerFactory")
public void listenerMethod() {...}
为了与 ActiveMQ 等其他消息代理具有互操作性,我想使用 JmsConnectionFactory
代替 ServiceBusJmsConnectionFactory
。
所以我只像这样改变我的 connectionfactory
bean
@Bean
public ConnectionFactory connectionFactory() {
JmsConnectionFactory connFactory = new JmsConnectionFactory("amqps://servicebusurl");
connFactory.setUsername(KEY NAME);
connFactory.setPassword(KEY);
return connFactory;
}
Open of resource:(JmsConsumerInfo: { ID:anid,destination = topicname}) Failed: The messaging entity 'servicebusname:Topic:topicname|qpid-jms:receiver:ID:theid' Could not be found.
我知道连接本身不是问题,因为我可以在此连接工厂的主题中发布。不知道是不是必须要使用服务总线连接工厂,或者有没有解决办法。
解决方法
我研究了 ServiceBusConnectionFactory
的工作原理,它使用了 JmsConnectionFactory
。
它自定义了 JmsConnectionFactory
的不同内容,因此我尝试以相同的方式对其进行自定义。
有效的是添加
connectionFactory.setExtension(JmsConnectionExtensions.AMQP_OPEN_PROPERTIES.toString(),(connection,uri) -> Map.of("com.microsoft:is-client-provider",true)
这使得使用连接工厂的侦听器创建非持久非共享主题订阅。