channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);? channel.basicReject(message.getMessageProperties().getDeliveryTag(), false); channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);?
在RabbitMQ中,basicAck
、basicNack
和basicReject
是三種核心的消息確認機制,作用及區別如下:
?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
)下消息一旦接收即被視為確認,存在丟失風險。