开始

image.png

延时一段时间再重回队列。
image.png
延时NACK后,消息就又回到rabbitmq。前面的消息处理完后,过段时间又把这条消息重新给我们消费端消费。
image.png
判断消息是否是旧的消息,增加次数
image.png

超过次数限制,直接拒绝,拒绝后消息进入死信队列。
image.png

实战

消息已经准备好被消费了 。消费之前要把消息先存库。为了防止意外。
image.png
消息消费成功的方法
image.png
实现这俩方法
image.png
先查询这条消息是否存在。
image.png
每一次消费只有一条消息,所以这里没有并发问题,所以这里不需要做分布式的锁
image.png
实现另外一个方法
image.png

listener

image.png
做一个抽象的listener
image.png

抽象类,实现ChannelAwareMessageListener。ChannelAwareMessageListener有channel
image.png

自己实现message方法。
image.png

注意Channel这个类是 rabbitmq.client的包下的
image.png

image.png
真正业务处理,放到try块里面。
image.png
通过强制业务实现的方法去做。
我们在抽象类里面写个抽象方法
image.png
主要调用业务的抽象方法
image.png
正常跑业务就是ack
image.png
成功后把消息删掉
image.png

如果消费异常了,第一种重回队列,延迟。
第二种消费次数太多就加入死信

注入最大次数
image.png
basicReject可能会抛异常。
image.png

我们把异常直接声明到方法上
image.png
如果消费次数没有超限。需要让他重回队列。次数越多休眠越多。
image.png
第一次休眠2秒,第二次4秒 第三次8秒。 第四次16秒。

image.png

nAck重回对列,果断时间我们还会消费它。最后参数用true表示重回队列。
image.png

结束