我有一个要求,我必须收听相同的交换、相同的队列但不同的路由。
下面是监听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/