栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

RabbitMQ—SpringBoot中实现手动签收重试三次进入死信队列

RabbitMQ—SpringBoot中实现手动签收重试三次进入死信队列

一、实现思路

上面文章说到,SpringBoot集成RabbitMQ后手动签收失败无法保证重试3次之后进入死信队列,这种情况就可以自己实现一个。大致的思路如下

类似于做一个计数器的功能,首先要为每个消息设置一个id,然后放入到Map结构中(java的Map或者Redis等都可以),结构是。有思路之后实现代码是比较容易的。

二、实现代码
  private Map counterMap=new ConcurrentHashMap<>();

  @RabbitListener(queues = RabbitMQStudentCourseTopicConfig.QUEUE)
  public void doChooseCourse(Message message, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag, Channel channel)throws IOException{
      MqMessage mqMessage = MessageHelper.msgToObj(message, MqMessage.class);

	  //选择studentId作为msg的id,为value赋值
      Integer integer = counterMap.get(mqMessage.getStudentId());
      if (integer==null){
          counterMap.put(mqMessage.getStudentId(), 1);
      }else{
          counterMap.put(mqMessage.getStudentId(),integer.intValue() + 1);
      }

      log.info("重试次数:{}",counterMap.get(mqMessage.getStudentId()));

      try{
          int i = 5/0;
      }catch (Exception e){
          if (counterMap.get(mqMessage.getStudentId())>=3){
              //第三个false:失败不重回队列
              channel.basicNack(deliveryTag,false,false);
              counterMap.remove(mqMessage.getStudentId());
          }
          channel.basicNack(deliveryTag,false,true);
          return;
      }
      log.info("消费成功");
  }

测试结果如下

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/300712.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号