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
)下消息一旦接收即被视为确认,存在丢失风险。