单个RabbitMQ队列和多个路由关键字

mec1mxoz  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(1)|浏览(222)

我们有一个应用程序将使用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使用单独的队列。

e1xvtsh3

e1xvtsh31#

RabbitMQ并不是这样工作的(它没有消息选择器的概念,这与JMS不同)。
事实上,消费者对路由密钥一无所知,只有生产者知道;您在@RabbitListener上看到它唯一原因是为了帮助配置。
要完成您想要的任务,您需要将3个不同的队列绑定到具有各自路由关键字的交换。
请注意,我不能更改设计,也不能为每个routingKey使用单独的队列。
您可以向容器(afterReceivePostProcessors)添加一个MessagePostProcessor,通过返回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个队列。

相关问题