MQ-02

配置:

    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

总结

重试有时候不会生效,代码里面也不要重新入队操作

你可能感兴趣的:(MQ-02)