配置:
listener:
simple:
acknowledge-mode: manual #手动确认
prefetch: 1
retry:
max-attempts: 3 #最大重试次数
enabled: true #是否开启消费者重试(为false时关闭消费者重试,true消费端代码异常会一直重复收到消息)
# default-requeue-rejected: false #重试次数超过上面的设置之后是否丢弃(false不丢弃时需要写相应代码将该消息加入死信队列)
代码:
1:注释掉
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
此时,数据虽然消费了,但是还是没有被ack
再次重启程序,还是会收到同样的消息
当前时间: 2021-09-06 21:53:39,获取的DeliveryTag:1
2: 不注释
此时启动后会再次收到数据,当前时间: 2021-09-06 21:54:41,获取的DeliveryTag:1
但是控制台没有阻塞了
异常情况
失败数据再次放回队列中
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
同时配置上
acknowledge-mode: manual #手动确认
没有配置重试。
就会出现一直打印报错信息,定位到是代码basicNack问题,让它重新入队了
例如:当前时间: 2021-09-06 22:42:40,获取的DeliveryTag:6260 打印到6千多次了
失败数据再次放回队列中,但是配置重试。
发现根本就不生效
listener:
simple:
acknowledge-mode: manual #手动确认
acknowledge-mode: auto
prefetch: 1
retry:
max-attempts: 3 #最大重试次数
enabled: true #是否开启消费者重试(为false时关闭消费者重试,这时消费端代码异常会一直重复收到消息)
关掉手动,保持重试
还是不生效。一次只错误一次。
配置 prefetch: 1
测试发送了4条数据,其中 ready 是3 表示有3条数据准备好了
untack 是1 表示有1条数据需要ack
total 表示总共有4条数据
这个prefetch 表示的就是每次最多处理几条
取消这个配置后,直接就是 ready 0 untack 4 total 4
总结
重试有时候不会生效,代码里面也不要重新入队操作