我有一个要求,我必须听同样的交换,相同的队列但不同的路线。
下面是来自差异路由的侦听消息的代码
@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,反之亦然。 如果有人需要其他详细信息,请告诉我。提前感谢您的帮助
答案 0 :(得分:2)
我不认为RabbitMQ可以实现您的目标。这违反了AMQP协议。
我必须听同样的交换,相同的队列但不同的路线。
路线不是AMQP概念。 AMQP具有绑定的概念 - 定义消息如何从交换(发布到它们的位置)移动到队列/队列(从中消耗它们)。
您应该为不同的路线(消费者)使用不同的队列。每个(唯一的)消费者应该使用不同的队列。路由不一致的可能性不大。消耗来自相同队列的两个消费者应仅用于负载平衡。 对于路由,您可以使用直接交换(最简单,最适合给定的情况)或标题交换。
请参阅https://www.rabbitmq.com/tutorials/amqp-concepts.html
在您的示例中,您已将两个路由键绑定到同一队列。因此,发送到交换的任何消息都将传递到该队列。然后,您有两个该队列的消费者。实际上,将为每条消息调用随机消费者(消费者之间的负载平衡)。
您可以在RabbitMQ GUI中查看。您将看到两个消费者连接到同一队列。