柠檬酸田 2023-04-23 15:52 采纳率: 66.7%
浏览 16

rabbitmq发布确认模式的问题

rabbitmq发布确认模式的问题
java客户端 为什么使用发布者确认模式发送给一个不存在的队列waitForConfirms() 这个方法返回值依然是true?
怎样才能使waitForConfirms()函数返回false?

  • 写回答

2条回答 默认 最新

  • AllenGd 领域专家: 大数据技术领域 2023-04-23 15:57
    关注

    结合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);
    

    另外需要注意的是,发布确认模式会带来一定的性能损失,因为发送方需要等待确认消息之后才能进行下一步操作。因此,建议仅在必要时使用该模式。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月23日