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
排查生产者与消费者问题原因:
- 队列波动。Queues图表波
- 消费者log日志这一行打debug模拟队列三种状态。