RabbitMqListener 没有正确监听相同的路由键

RabbitMqListener not listening properly for same routingkeys

我有一个要求,我必须收听相同的交换、相同的队列但不同的路由。

下面是监听不同路由消息的代码

@Component
public class EmailMessageHandler {

@RabbitListener(bindings = @QueueBinding(
   value = @Queue(value = "queue", durable = "true"),
        exchange = @Exchange(value = "exchange", durable = "true" ,type = ExchangeTypes.DIRECT),
        key = "key1")
)
public void method1(String message) throws Exception {

    System.out.println("New message received" + message);
}

 @RabbitListener(bindings = @QueueBinding(
        value = @Queue(value = "queue", durable = "true"),
        exchange = @Exchange(value ="exchange", durable = "true",type = ExchangeTypes.DIRECT),
        key = "key2")
)
public void method(Message message) throws Exception {
    System.out.println("New message received" + message);
}
}

这里的问题是消息没有始终如一地发送到正确的方法, 例如:key1 消息将发送给 key2,反之亦然。 如果有人需要额外的帮助,请告诉我 details.Appreciate 你的提前帮助

我认为使用 RabbitMQ 无法实现您的目标。它违反了 AMQP 协议。

I have to listen to same exchange,same queue but different routes.

Route 不是 AMQP 概念。 AMQP 具有 绑定 的概念 - 定义消息如何从交换(它们被发布到的地方)移动到 queue/queues(它们被消费的地方)。

你应该对不同的路由(消费者)使用不同的queue。每个(唯一的)消费者应该从不同的 queue 消费。不会有路由不一致的可能性。从同一个 queue 消费的两个消费者应该只用于负载平衡。 对于路由,您可以使用直接交换(最简单,最适合给定情况)或 header 交换。

https://www.rabbitmq.com/tutorials/amqp-concepts.html

在您的示例中,您将两个路由键绑定到同一个 queue。因此,发送到交换器的任何消息都将传递到那个 queue。然后,您有两个消费者 queue。因此,实际上,将为每条消息调用随机消费者(消费者之间load-balancing)。

您可以在 RabbitMQ GUI 中查看。您将看到两个消费者连接到同一个 queue.