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

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

我希望发送到带有路由 key {userId} 的直接交换的消息只能由发生绑定(bind)的特定应用服务器接收。

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

当 websocket 进入时,我正在使用 spring-amqp 创建动态绑定(bind)

// 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);

最佳答案

其实你走对了。

是的:使用适当的绑定(bind)直接交换应该可以拯救你。

在 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 ,但之后消息被放置到队列中,该队列可能在不同的机器上有多个消费者。

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

您应该考虑创建一个独特的新队列(自动删除很好)并从中准确地绑定(bind)和监听。 SimpleMessageListenerContainer 在运行时支持 addQueues() 为新队列启动新消费者。

我认为这应该对你有用。

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

关于RabbitMQ - 向队列中的特定消费者发送消息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35783240/

10-16 03:45