繁体   English   中英

单个 RabbitMQ 队列和多个路由键

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM