我的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并看到@JmsListener正在设置MessagingMessageListenerAdapter,它是一个调用你定义的方法的MessageListener适配器。有趣的部分是AbstractMessageListenerContainer,它是一个
Spring消息监听器容器实现的抽象基类。可以托管标准的JMS javax.jms.MessageListener或Spring的SessionAwareMessageListener来进行实际的消息处理。
有一种方法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的实例。
因此,要配置它,我们必须设置我们的工厂,订阅共享和持久到真。
@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;
}
现在你可以使用Annotation如下:
@JmsListener(destination = "PublishSubscribeWithPreDefinedQueues", containerFactory="containerFactory", subscription="Queue1")
并且订阅名称现在是您的地址的队列名称。