我的Artemis经纪人的配置如下:
<address name="PublishSubscribeWithPreDefinedQueues">
<multicast>
<queue name="Queue1"/>
<queue name="Queue2"/>
</multicast>
</address>
我如何告诉消费客户端连接到队列1?根据文档,我必须将地址名称和队列名称与::
分开,但我无法正常工作。
@JmsListener(destination = "PublishSubscribeWithPreDefinedQueues::Queue1")
这将创建一个称为PublishSubscribeWithPreDefinedQueues::Queue1
的新地址。
有什么想法吗?谢谢!
您试图实现的是共享耐用的消费者。多个听众,但是负载平衡了同一FQQN的多个消费者
所以我也有同样的问题,我可以使用Spring Boot。我看了一些春季靴子,看到@jmslistener正在设置一个MessagingMessageListenerAdapter,这是一个MessageListener适配器,可调用您定义的方法。有趣的部分是AmpactMessageListenerContainer,它是
弹簧消息侦听容器的抽象基类 实施。可以托管标准JM javax.jms.messagelistener或春季的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.messagingmessagingmessagegelisteneradapter,因为所有@jmslisteners都是MessagingMesgingMesgageMessageGeListenerAdapter。了配置它,我们必须将工厂设置为订阅共享且耐用为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")
现在,订阅名称是地址的队列名称。