ACK与NACK
在上一节中,我们研究了消费端的限流,了解到手动发送ACK
的API
,对于消费端来说,不止能发ACK
还能发NACK
,因为总会有消息接收出问题的情况。
当发送ACK
后,告知Broker成功被消费,就结束了一条消息流程。
当发送NACK
,消息未被成功消费,那么有两种情况,对于requeue
的设置
- 如果为
true
,即重回队列,将未被成功消费的信息放到队列最末端,等等重新被消费 - 如果为
false
,即不做任何操作
使用方式
NACK:void basicNack(long deliveryTag, boolean multiple, boolean requeue)
ACK:void basicAck(long deliveryTag, boolean multiple)
重回队列
- 消费端重回队列是为了对没有处理成功的消息,把消息重新会递给Broker!
- 重回队列,会把消费失败的消息重新添加到队列的尾端,供消费者继续消费。
- 代码设置在
channel.basicNack
的最后一个参数 - 一般我们在实际应用中,都会关闭重回队列,也就是设置为
false
代码实现
这里我们发送五条消息并设置header
为0-4
,在自定义消费者中,对于第0条消息进行NACK
的返回,并设置为重回队列requeue=true
,来看看效果
生产端
1 | public class Provider { |
消费端
1 | public class Consumer { |
自定义消费者
1 | public class MyConsumer extends DefaultConsumer { |
测试
通过测试结果可以清晰的看出,当响应NACK后,消息重回队列,又因为它的索引一直是0,所以会一直循环返回NACK,这里我就直接停掉了。
注意
一般工作中不会设置重回队列这个属性,我们都是自己去做补偿或者投递到延迟队列里的,然后指定时间去处理即可。