【问题标题】:Several queueNames for Rabbit in SpringSpring 中 Rabbit 的几个 queueNames
【发布时间】:2021-10-28 22:18:52
【问题描述】:
这是我的 Spring 应用程序的兔子 yml.config:
event.rabbit:
host: {{ params.app_properties.mq_host }}
port: {{ params.app_properties.mq_port }}
username: ${mq_username}
password: ${mq_password}
virtual-host: {{ params.app_properties.mq_vhost }}
exchange.name: {{ params.app_properties.mq_exchange }}
queue.name: {{ params.app_properties.event_rabbit_queue_name}}
是否可以让rabbit监听多个主机的多个队列?
【问题讨论】:
标签:
spring-boot
rabbitmq
spring-amqp
spring-rabbit
rabbitmq-exchange
【解决方案1】:
Spring AMQP 中的ListenerContainerFactoryBean(作为顶层)抽象,可以配置多个队列来消费:
public void setQueueNames(String... queueName) {
this.queueNames = queueName;
}
public void setQueues(Queue... queues) {
this.queues = queues;
}
AbstractConnectionFactory上可以提供多个主机:
/**
* Set addresses for clustering.
* This property overrides the host+port properties if not empty.
* @param addresses list of addresses with form "host[:port],..."
*/
public synchronized void setAddresses(String addresses) {
但是正如您所见,它们都必须在集群中,因此所有这些队列必须在所有这些集群成员上进行镜像,以便您的解决方案具有容错行为。
您显示的属性似乎与 Spring Boot 自动配置无关,但这里是要调查的相应 RabbitProperties。
注意:如果您只是实现消费者端,则不需要知道交换。您总是从特定队列中消费。交换是生产者如何分发和传递您发送的消息的问题。
【解决方案2】:
我已经用 MQ 做到了,
但从来没有和兔子在一起。
MQ 解决方案似乎仍然适用于 Rabbit。
- 为每个服务器创建一个不同的
ConnectionFactory
(使用您自己的配置属性设置,而不是默认的 Rabbit)。
- 为每个服务器创建一个
ContainerFactory,
请参阅侦听器注释中的 connectionFactory。
手动将 containerFactory 中的 connectionFactory 设置为“正确的”connectionFactory(由正确的服务器定义)。
- 请参阅侦听器注释中的侦听队列名称。
- 为每个服务器创建一个 jmsTemplate,
与 containerFactory 一样,
手动将 jmsTemplate 中的 connectionFactory 设置为“正确”值。
还,
为每个 jmsTemplate 设置一个唯一的限定符值。
- 注入 JmsTemplate 时,
请参阅限定符。