Azure 服务总线主题上的非持久 JMS 订阅

问题描述

我正在尝试使用 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)

这使得使用连接工厂的侦听器创建非持久非共享主题订阅。