如何使用Spring JMS访问FQQN?

时间:2017-12-13 12:20:47

标签: spring jms activemq-artemis

我的Artemis经纪人配置如下:

<address name="PublishSubscribeWithPreDefinedQueues">
  <multicast>
    <queue name="Queue1"/>
    <queue name="Queue2"/>
  </multicast>
</address>

如何告诉我的消费客户端连接到Queue1?根据{{​​3}},我必须将地址名称和队列名称与::分开,但我无法使其正常工作。

@JmsListener(destination = "PublishSubscribeWithPreDefinedQueues::Queue1")

这将创建一个名为PublishSubscribeWithPreDefinedQueues::Queue1的新地址。

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:0)

您想要实现的是共享的耐用消费者。多个侦听器,但负载平衡同一FQQN的多个消费者。

所以我有完全相同的问题,我使用弹簧启动。我看了一下spring boot并看到@JmsListener正在设置MessagingMessageListenerAdapter,它是一个调用你定义的方法的MessageListener适配器。 有趣的部分是AbstractMessageListenerContainer,它是

  

Spring消息侦听器容器的抽象基类   实现。可以托管标准JMS   javax.jms.MessageListener或Spring的SessionAwareMessageListener for   实际的消息处理。

有一个方法getDefaultSubscriptionName(Object messageListener)可以获取您的Message侦听器。 如果我们看一下实现:

    protected String getDefaultSubscriptionName(Object messageListener) {
    if (messageListener instanceof SubscriptionNameProvider) {
        return ((SubscriptionNameProvider) messageListener).getSubscriptionName();
    }
    else {
        return messageListener.getClass().getName();
    }
}

因此,如果我们不提供订阅名称,spring会将org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter作为名称,因为所有@JmsListeners都是MessagingMessageListenerAdapter的实例。

因此,要配置它,我们必须设置我们的工厂,订阅共享且持久为true。

@Bean
public DefaultJmsListenerContainerFactory containerFactory(ConnectionFactory connectionFactory) {
    DefaultJmsListenerContainerFactory factory =
            new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    factory.setSubscriptionDurable(true);
    factory.setSubscriptionShared(true);
    factory.setDestinationResolver(new BeanFactoryDestinationResolver(beanFactory)); //or new DynamicDestinationResolver()
    factory.setPubSubDomain(true);
    return factory;
}

现在您可以使用注释:

@JmsListener(destination = "PublishSubscribeWithPreDefinedQueues", containerFactory="containerFactory", subscription="Queue1")

,订阅名称现在是您地址的队列名称。