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

时间:2017-02-07 21:32:33

标签: java spring-rabbitmq

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

下面是来自差异路由的侦听消息的代码

@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,反之亦然。 如果有人需要其他详细信息,请告诉我。提前感谢您的帮助

1 个答案:

答案 0 :(得分:2)

我不认为RabbitMQ可以实现您的目标。这违反了AMQP协议。

  

我必须听同样的交换,相同的队列但不同的路线。

路线不是AMQP概念。 AMQP具有绑定的概念 - 定义消息如何从交换(发布到它们的位置)移动到队列/队列(从中消耗它们)。

您应该为不同的路线(消费者)使用不同的队列。每个(唯一的)消费者应该使用不同的队列。路由不一致的可能性不大。消耗来自相同队列的两个消费者应仅用于负载平衡。 对于路由,您可以使用直接交换(最简单,最适合给定的情况)或标题交换。

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

在您的示例中,您已将两个路由键绑定到同一队列。因此,发送到交换的任何消息都将传递到该队列。然后,您有两个该队列的消费者。实际上,将为每条消息调用随机消费者(消费者之间的负载平衡)。

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