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