开始
延时一段时间再重回队列。
延时NACK后,消息就又回到rabbitmq。前面的消息处理完后,过段时间又把这条消息重新给我们消费端消费。
判断消息是否是旧的消息,增加次数
超过次数限制,直接拒绝,拒绝后消息进入死信队列。
实战
消息已经准备好被消费了 。消费之前要把消息先存库。为了防止意外。
消息消费成功的方法
实现这俩方法
先查询这条消息是否存在。
每一次消费只有一条消息,所以这里没有并发问题,所以这里不需要做分布式的锁
实现另外一个方法
listener
做一个抽象的listener
抽象类,实现ChannelAwareMessageListener。ChannelAwareMessageListener有channel
自己实现message方法。
注意Channel这个类是 rabbitmq.client的包下的
真正业务处理,放到try块里面。
通过强制业务实现的方法去做。
我们在抽象类里面写个抽象方法
主要调用业务的抽象方法
正常跑业务就是ack
成功后把消息删掉
如果消费异常了,第一种重回队列,延迟。
第二种消费次数太多就加入死信
注入最大次数
basicReject可能会抛异常。
我们把异常直接声明到方法上
如果消费次数没有超限。需要让他重回队列。次数越多休眠越多。
第一次休眠2秒,第二次4秒 第三次8秒。 第四次16秒。
nAck重回对列,果断时间我们还会消费它。最后参数用true表示重回队列。