RabbitMQ中,basicAck、basicNack和basicReject是三种核心的消息确认机制

java 复制代码
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);  

channel.basicReject(message.getMessageProperties().getDeliveryTag(), false); 

channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); 

在RabbitMQ中,basicAckbasicNackbasicReject是三种核心的消息确认机制,作用及区别如下:


‌**1. basicAck(成功确认)**‌

  • 作用‌:明确告知RabbitMQ消息已成功处理,应从队列中移除。

  • 参数说明 ‌:

    • deliveryTag:消息唯一标识符(单调递增)。
    • multiple=false:仅确认当前消息(若为true则批量确认此前所有未确认消息)。
  • 示例场景 ‌:

    复制代码
    channel.basicAck(deliveryTag, false); // 确认单条消息处理成功 

‌**2. basicNack(批量拒绝)**‌

  • 作用‌:拒绝消息并支持批量操作,可选择是否重新入队。

  • 参数说明 ‌:

    • deliveryTag:消息标识符2。
    • multiple=false:仅拒绝当前消息(true则拒绝此前所有未确认消息)。
    • requeue=true:消息重新入队(false则丢弃或进入死信队列)。
  • 示例场景 ‌:

    复制代码
    channel.basicNack(deliveryTag, false, true); // 拒绝单条消息并重新入队 

‌**3. basicReject(单条拒绝)**‌

  • 作用 ‌:拒绝单条消息,功能类似basicNack但不支持批量操作。

  • 参数说明 ‌:

    • deliveryTag:消息标识符。
    • requeue=false:直接丢弃或进入死信队列(true则重新入队)。
  • 示例场景 ‌:

    复制代码
    channel.basicReject(deliveryTag, false); // 拒绝消息且不重新入队 

关键区别总结

方法 批量支持 重新入队控制 典型用途
basicAck 不适用 成功处理后的确认
basicNack 批量失败处理与重试
basicReject 单条消息的立即拒绝

注意‌:

  • 若消息被拒绝且未重新入队,且队列配置了死信交换器(DLX),消息会路由至死信队列。
  • 自动确认模式(autoAck=true)下消息一旦接收即被视为确认,存在丢失风险。