spring - 如何使用 Spring JMS 访问 FQQN?

标签 spring jms activemq-artemis

我的 Artemis 代理配置如下:

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

如何告诉我的消费客户端连接到 Queue1?根据the docs我必须用 :: 分隔地址名称和队列名称,但我无法让它工作。

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

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

有什么想法吗?谢谢!

最佳答案

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

所以我有完全相同的问题,并且我使用 Spring Boot。我查看了一下 Spring Boot,发现 @JmsListener 正在设置一个 MessagingMessageListenerAdapter,它是一个调用您定义的方法的 MessageListener 适配器。 有趣的部分是 AbstractMessageListenerContainer,它是一个

Abstract base class for Spring message listener container implementations. Can either host a standard JMS javax.jms.MessageListener or Spring's SessionAwareMessageListener for actual message processing.

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

    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 作为名称,因为所有 @JmsListener 都是 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")

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

关于spring - 如何使用 Spring JMS 访问 FQQN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47792908/

相关文章:

java - JMS-从远程 Glassfish 接收消息

java - JMS消息生产者不会将消息发送到队列

messaging - 在启动 wildfly 10.1 与 artemis 一起工作时,未安装 jboss.ra.activemq-ra 错误仍然存​​在

spring - @Scheduled 线程是否终止?

java - Spring WS : What class invokes unmarshalling?

java - @ComponentScans 和@ComponentScan 有什么区别?

json - 将 JSON 发布到 REST API

java - 中间件和 SOA 示例

java - Artemis 使用 JMS 持久订阅多播地址