[英]Single RabbitMQ queue and multiple routing key
我们有一个将使用 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 使用单独的队列。
RabbitMQ 不是这样工作的(它没有消息选择器的概念,不像 JMS)。
事实上,消费者对路由键一无所知,只有生产者; 您在@RabbitListener
上看到它的唯一原因是帮助配置。
为了做你想做的事,你需要使用各自的路由键将 3 个不同的队列绑定到交换器。
请注意,我无法更改设计并为每个 routingKey 使用单独的队列。
您可以将MessagePostProcessor
添加到容器( afterReceivePostProcessors
)以通过返回 null 来丢弃不需要的消息。 这是框架为过滤消息提供的唯一机制。
/**
* Set {@link MessagePostProcessor}s that will be applied after message reception, before
* invoking the {@link MessageListener}. Often used to decompress data. Processors are invoked in order,
* depending on {@code PriorityOrder}, {@code Order} and finally unordered.
* @param afterReceivePostProcessors the post processor.
* @since 1.4.2
* @see #addAfterReceivePostProcessors(MessagePostProcessor...)
*/
public void setAfterReceivePostProcessors(MessagePostProcessor... afterReceivePostProcessors) {
但最好的解决方案是 3 个队列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.