spring.rabbitmq.listener.simple.acknowledge-mode = manual and auto 排查

发布时间 2023-03-22 21:16:39作者: 濑川一线天

spring.rabbitmq.listener.simple.acknowledge-mode=manual

*配置改成手动之后,spring不会报错。所以需要消费者抛异常

*channel属性

       basicNack和basicReject原生效果差不多;requeue重返队列;

 1  @RabbitHandler //定义了一个消费者方法
 2     @RabbitListener(queues = "direct_q1") //定义消费的是哪一个队列
 3     public void  process(Message message, Channel channel) throws IOException {
 4 
 5          //如果requeue 设置 false, MQ Server 会直接丢弃这个消息
 6          //设置成true,MQ Server会不断地重新投递这个消息,可能会出现死循环
 7          //channel.basicReject(deliveryTag,true);
 8         //如果multiple 设置 false, 代表消息得到应答一个一个来
 9         //如果设置成 true,就是 消息顺序执行完之后,批量应该(A,B,C,D)
10         //channel.basicAck(deliveryTag, false);应答,false见第8行解释
11        // channel.basicNack(deliveryTag,false,true);无应答无限重复
12 
13         long deliveryTag = message.getMessageProperties().getDeliveryTag();
14         String msg = new String(message.getBody());
15         try {
16             if(msg.equals("3")){
17                 int c = 5/0;
18             }
19             channel.basicAck(deliveryTag, false);
20             log.debug("消费者1:收到了消息{},并且 ACK ",msg);
21         } catch (Exception ex){
22              log.error(ex.getMessage());
23             channel.basicNack(deliveryTag,false,false);
24             log.debug("消费者1:收到了消息{},并且 NACK ",msg);
25         }
26 
27     }

 spring.rabbitmq.listener.simple.acknowledge-mode=auto

配置自动会陷入死循环。在原配置的基础上需要进行其他配置

###Rabbit
spring.rabbitmq.host=192.168.20.33
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.listener.simple.acknowledge-mode = auto
#spring.rabbitmq.listener.direct.acknowledge-mode=manual
#retry重复机制
spring.rabbitmq.listener.simple.retry.enabled=true
#重试间隔
spring.rabbitmq.listener.simple.retry.initial-interval= 2000ms
#尝试每次重复间隔时间
spring.rabbitmq.listener.simple.retry.multiplier=2
#重试最多次数
spring.rabbitmq.listener.simple.retry.max-attempts=3
#尝试次数超过最大时间丢弃
spring.rabbitmq.listener.simple.retry.max-interval=10000


spring.rabbitmq.listener.simple.prefetch=5

 

排查生产者与消费者问题原因:

  1. 队列波动。Queues图表波
  2. 消费者log日志这一行打debug模拟队列三种状态。