rabbitmq发布确认模式的问题
java客户端 为什么使用发布者确认模式发送给一个不存在的队列waitForConfirms() 这个方法返回值依然是true?
怎样才能使waitForConfirms()函数返回false?
结合ChatGPT和自己的理解回答:
在使用发布确认模式时,发布者确认的机制是在消息被确认接收之前一直等待,直到收到了 Basic.Ack 或 Basic.Nack 命令。
当使用发布者确认模式时,发送到一个不存在的队列依然会向 RabbitMQ 服务器发送消息。但是它将无法路由到任何队列并在一个不可路由队列(DLX或它的父级)中进入死信队列,如果有设置的话。因此,waitForConfirms() 方法仍然会返回 true,因为消息被发送到 RabbitMQ 服务器上。
要想使 waitForConfirms() 方法返回 false,可以在发送消息时捕获 ConfirmListener 中的 Basic.Nack 事件,并在该事件中更新消息的状态。例如,可以将消息标记为发送失败,并记录日志以便追踪。代码示例:
channel.confirmSelect();
channel.addConfirmListener(new ConfirmListener() {
@Override
public void handleAck(long deliveryTag, boolean multiple) throws IOException {
// 处理确认消息的情况
}
@Override
public void handleNack(long deliveryTag, boolean multiple) throws IOException {
// 处理未确认消息的情况
// 更新消息状态,例如将消息标记为发送失败
// 记录日志以便追踪
}
});
channel.basicPublish(exchangeName, "nonExistingQueue", true, null, messageBody);
另外需要注意的是,发布确认模式会带来一定的性能损失,因为发送方需要等待确认消息之后才能进行下一步操作。因此,建议仅在必要时使用该模式。
消息是发给交换机Exchange,交换机收到就会给客户端回复成功。然后交换机根据路由信息将消息投递给具体队列。如果投递不到队列,会通过回调方法告诉客户端,需要客户端实现 RabbitTemplate.ConfirmCallback 和 RabbitTemplate.ReturnCallback 接口,分别重写里面的 confirm 和 returnedMessage 方法,对失败的情况进行了解和处理,并且将这两个接口的实现类通过 setConfirmCallback 和 setReturnCallback 方法设置给 RabbitTemplate。