如何使用 Spring JMS 访问 FQQN?

Posted

技术标签:

【中文标题】如何使用 Spring JMS 访问 FQQN?【英文标题】:How to access a FQQN with Spring JMS? 【发布时间】:2018-05-27 08:03:59 【问题描述】:

我的 Artemis 代理配置如下:

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

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

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

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

有什么想法吗?谢谢!

【问题讨论】:

【参考方案1】:

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

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

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

有一种方法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 JMS 访问 FQQN?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring JMS 发布 JMS 主题?

远程机器未运行时如何为远程 JMS 队列初始化 ConnectionFactory?

Spring整合JMS

如何使用spring boot jms收听话题

JMS解决系统间通信问题

Spring使用MappingJackson2MessageConverter发送接收ActiveMQ消息