RabbitMQ - 将消息发送到队列中的特定消费者

问题描述 投票:0回答:3

这是场景 - 有多个应用程序服务器。浏览器可以通过 websocket 连接到任何应用程序服务器。

应用程序服务器(消费者)都在监听特定的队列。一旦收到 Web 套接字连接,特定的应用程序服务器就会将队列与路由键 {userId} 绑定到直接交换。

我希望发送到带有路由键 {userId} 的直接交换的消息仅由发生绑定的特定应用程序服务器接收。

在这种情况下,直接交换是正确的交换吗?或者应该使用其他类型的交换?

当 websocket 进来时,我使用 spring-amqp 创建动态绑定

// create the RabbitMq queue and bind to it
String routingKey = MessageConstants.getRoutingKeyForUserRecommendationQueue(user);
Binding userRecommendationBinding = BindingBuilder.bind(userRecommendationsQueue).
    to(directExchange).with(routingKey);
amqpAdmin.declareBinding(userRecommendationBinding);
rabbitmq spring-amqp spring-rabbit
3个回答
7
投票

向队列中的特定消费者发送消息

这是不可能的。连接到队列的任何消费者都有机会消费队列中的任何给定消息

我希望发送到带有路由键 {userId} 的直接交换的消息仅由发生绑定的特定应用程序服务器接收。

您可以通过为您的消费者创建

exclusive
/
autoDelete
队列来完成此操作,并使用绑定将该消费者的所有消息定向到该队列。

在这种情况下,直接交换是正确的交换吗?

直接交流或者话题交流都可以。直接交流稍微容易理解一些,但是话题交流更灵活


5
投票

其实你走对了。

是的:具有适当绑定的直接交换应该可以拯救您。

请参阅 RabbitMQ 教程中的更多信息:http://www.rabbitmq.com/tutorials/tutorial-four-java.html

另请查看有关此事的 Spring AMQP 示例:https://github.com/spring-projects/spring-amqp-samples/tree/master/rabbitmq-tutorials

更新

不幸的是,事实并非如此。这些消息似乎随机发送给任何消费者,而不仅仅是创建绑定的消费者。

米-米-米。这是可能的,因为我们只路由我的

key
,但之后消息被放置到队列中,队列可能在不同的机器上有多个消费者。

在这种情况下是的:动态绑定没有帮助。

您应该考虑创建一个独特的新队列(自动删除就可以)并从中准确地绑定和侦听。

SimpleMessageListenerContainer
支持在运行时为新队列启动新消费者。

我认为这应该对你有用。

您仍然不应该在生产者方面做任何事情:相同的

addQueues()

exhchange
逻辑。
    


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.