你试图实现的是一个共享的耐用消费者。多个侦听器,但对同一 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 的实例。
所以要配置它,我们必须将我们的工厂设置为订阅共享和持久为真。
@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")
订阅名称现在是您地址的队列名称。