The RoutingConnectionFactory
一般用于发布消息。
在侦听器容器中使用路由工厂时,必须配置查找键以匹配容器中配置的队列名称。
From 文档 https://docs.spring.io/spring-amqp//reference/html/_reference.html#routing-connection-factory:
同样从版本 1.4 开始,您可以在侦听器容器中配置路由连接工厂。在这种情况下,队列名称列表将用作查找键。例如,如果您将容器配置为setQueueNames("foo", "bar")
,查找键将是"[foo,bar]"
(没有空间)。
所以;如果一个RabbitListener
监听队列foo
路由查找键必须是[foo]
。 (您可以使用不同的密钥多次添加相同的 CF)。
或者您可以简单地创建多个容器工厂,每个容器工厂都有一个具体的 CF 而不是路由 CF。
EDIT
假设你有
@RabbitListener(queues = "myQueue", connectionFactory = "myRabbitListenerContainerFactory")
public void listen(...) {
...
}
If myQueue
is in client1
的虚拟主机,那么您需要在路由器 CF 映射中添加一个条目,因此...
targetConnectionFactories.put("[myQueue]", client1ConnectionFactory());
...因为为侦听器生成的侦听器容器将在其查找键中使用队列名称。
或者,创建2个集装箱工厂;每个都直接与 client1 和 client2 CF 连接,而不是与路由 CF...
@Bean
public SimpleRabbitListenerContainerFactory client1ListenerContainerFactory() {
@Bean
public SimpleRabbitListenerContainerFactory client2ListenerContainerFactory() {
and
@RabbitListener(queues = "myQueue", connectionFactory = "client1ListenerContainerFactory")
public void listen(...) {
...
}
即根本不要对侦听器使用路由 CF - 容器只有一个连接。