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

标签 java spring-rabbit

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

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

@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,反之亦然。 让我知道是否有人需要更多详细信息。提前感谢您的帮助

最佳答案

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

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

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

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

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

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

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

关于java - RabbitMqListener 没有正确监听相同的路由键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42100392/

相关文章:

java - If 语句代码问题

java - 在Jetty HttpClient Hang上寻求建议

java - 开发模式下的 GWT + AppEngine 应用程序在本地网络上不可用

Spring RabbitListner 使用注释语法停止监听队列

java - spring-amqp读取一条rabbit消息最早的入口点是什么?

java - 同步对 SimpleDateFormat 的访问

java - 我正在尝试从定义的字符串中删除字符串中的字符。错误出现在这里 : if(s. charAt(x) == punct.charAt(y))

Spring-boot-starter RabbitMQ 全局错误处理

spring-amqp - 兔子MQ : Why don't channels reopen after a reconnection?

java - SimpleMessageListener 与 DirectMessageListener