当前位置:   article > 正文

springboot整合rabbitMQ系列6 死信队列演示,消息被拒绝(basicReject/ basicNack)并且不再重新投递到队列时requeue=false_delverytag重新投递不增加

delverytag重新投递不增加

先用rabbitmq控制台创建正常的交换机,队列,死信的交换机,队列,绑定关系等,查看以下博文,
只要 以下文章的1-3步,因为这里演示另种情况,消息到死信队列
rabbitmq死信队列 用rabbitmq web控制台创建交换机,队列,绑定关系,发送TTL超时消息 来做演示_rabbitmq 控制台 添加死信队列-CSDN博客

生产者为方便,直接用rabbitmq控制台发送消息

创建一个消费者工程,并手动ack确认,部分api的使用可查看以下博文,
springboot整合rabbitmq 消费者Consumer 手动进行ack确认_rabbitmq中的basicconsume方法的使用,手动确定ack-CSDN博客
改动关键代码  channel.basicNack(deliveryTag, true, false); 
就是最后一个参数 ,并且不再重新投递到原交换机 requeue=false


剩下的改动没啥变化,直接用上面的工程就可以了,为了看起来不乱,还是直接再写下吧

1 消费者工程 application.yml文件

  1. server:
  2. port: 8021
  3. spring:
  4. #给项目来个名字
  5. application:
  6. name: rabbitmq-test
  7. #配置rabbitMq 服务器
  8. rabbitmq:
  9. host: 127.0.0.1
  10. port: 5672
  11. username: need
  12. password: 123456
  13. #虚拟host 可以不设置,使用server默认host
  14. virtual-host: /testhost
  15. #ack 确认方式
  16. listener:
  17. simple:
  18. acknowledge-mode: manual
  19. direct:
  20. acknowledge-mode: manual

2 消费者代码

  1. import com.rabbitmq.client.Channel;
  2. import org.springframework.amqp.core.Message;
  3. import org.springframework.amqp.rabbit.annotation.RabbitListener;
  4. import org.springframework.stereotype.Component;
  5. import java.io.IOException;
  6. @Component
  7. public class xiaofeizhe_1 {
  8. //监听的队列名称
  9. @RabbitListener(queues = "zhengchang_queue")
  10. /**
  11. * 注意:后4个参数,需要生产者发送消息时加上,否则为报错,注解里添加 required=false 或 删除参数
  12. */
  13. public void process(Message message,
  14. Channel channel,
  15. @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag,
  16. @Header(AmqpHeaders.MESSAGE_ID) String messageId,
  17. @Header(AmqpHeaders.CONSUMER_TAG) String consumerTag,
  18. CorrelationData correlationData) throws IOException {
  19. //long deliveryTag = message.getMessageProperties().getDeliveryTag();
  20. //
  21. //@Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag
  22. try {
  23. String msgbody = new String(message.getBody());
  24. //1.接收转换消息
  25. System.out.println("消费者 1 收到消息 : " + msgbody + " 编号: " + deliveryTag);
  26. //2. 处理业务逻辑
  27. System.out.println("处理业务逻辑...");
  28. //模拟出现错误
  29. System.out.println(500 / Double.valueOf(msgbody));
  30. //3. 手动签收
  31. channel.basicAck(deliveryTag, true);
  32. } catch (Exception e) {
  33. //4.拒绝签收
  34. /*
  35. 第三个参数:requeue:重回队列。如果设置为true,则消息重新回到queue,broker会重新发送该消息给消费端
  36. 这里要演示发到死信队列,就设置为false
  37. */
  38. channel.basicNack(deliveryTag, true, false);
  39. //channel.basicReject(deliveryTag,false);
  40. }
  41. }
  42. }

3 用rabbitmq控制台发送消息来演示,如果发正常的数字,就可以直接消费,但是如果发乱七八糟的文字,做不了运算,就会出错,就会通过 消息被拒绝(basicReject/ basicNack)并且不再重新投递 requeue=false,发送到死信队列

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/509787
推荐阅读
相关标签
  

闽ICP备14008679号