我们有一个应用程序将使用RabbitMQ。设计是使用一个单一的交换单一队列与多个路由关键字的多个团队,他们将通过这个单一的队列进行通信。我正在开发一个java应用程序,只是监听该队列使用一个routingKey分配给我的团队。
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "queue", durable = "true"),
exchange = @Exchange(value = "exchange", autoDelete = "false", type = "topic"),
key = "abc_rk"))
public void consumeMessagesFromRabbitMQ(Request request) throws InterruptedException {
System.out.println("Start:Request from RabbitMQ: " + request);
Thread.sleep(10000L);
System.out.println("End:Request from RabbitMQ: " + request);
}
假设队列有3个routingKey消息,我的应用程序只想监听其中的abc_rk
。但是当我运行这段代码时,它并没有过滤掉其他消息,而是不管我在“key =?”中设置了什么,它都会从队列中提取所有消息。注意,我不能改变设计,为每个routingKey使用单独的队列。
1条答案
按热度按时间e1xvtsh31#
RabbitMQ并不是这样工作的(它没有消息选择器的概念,这与JMS不同)。
事实上,消费者对路由密钥一无所知,只有生产者知道;您在
@RabbitListener
上看到它唯一原因是为了帮助配置。要完成您想要的任务,您需要将3个不同的队列绑定到具有各自路由关键字的交换。
请注意,我不能更改设计,也不能为每个routingKey使用单独的队列。
您可以向容器(
afterReceivePostProcessors
)添加一个MessagePostProcessor
,通过返回null来丢弃不需要的消息。这是框架提供的过滤消息的唯一机制。但最好的解决方案是3个队列。