0

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

我知道连接本身不是问题,因为我可以使用此连接工厂在主题中发布。我想知道是否必须使用服务总线连接工厂或者是否有解决方案。

4

1 回答 1

0

我看了看它是如何ServiceBusConnectionFactory工作的,它使用JmsConnectionFactory. 它定制了不同的东西,JmsConnectionFactory所以我尝试以同样的方式定制它。有效的是添加 connectionFactory.setExtension(JmsConnectionExtensions.AMQP_OPEN_PROPERTIES.toString(), (connection, uri) -> Map.of("com.microsoft:is-client-provider",true)

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

于 2021-03-09T08:03:50.167 回答