1. 消费过程发生错误容易造成死循环
  2.  
  3. 1.控制重发次数
  4. 2.try+catch+手动ack
  5. 3.try+catch+手动ack+死信队列(重试次数就失效了,因为捕捉确认后被打入了相应的死信队列)

  1. void basicAck(long deliveryTag, boolean multiple) throws IOException;
    第一个参数deliveryTag:发布的每一条消息都会获得一个唯一的deliveryTag,(任何channel上发布的第一条消息的deliveryTag1,此后的每一条消息都会加1),deliveryTagchannel范围内是唯一的
    第二个参数multiple:批量确认标志。如果值为true,则执行批量确认,此deliveryTag之前收到的消息全部进行确认; 如果值为false,则只对当前收到的消息进行确认

  1. void basicReject(long deliveryTag, boolean requeue) throws IOException;
    第一个参数deliveryTag:发布的每一条消息都会获得一个唯一的deliveryTagdeliveryTagchannel范围内是唯一的
    第二个参数requeue:表示如何处理这条消息,如果值为true,则重新放入RabbitMQ的发送队列,如果值为false,则通知RabbitMQ销毁这条消息

    channel.basicNack channel.basicReject的补充,提供一次对多条消息进行拒绝的功能
  1. void basicNack(long deliveryTag, boolean multiple, boolean requeue) throws IOException;
    第一个参数deliveryTag:发布的每一条消息都会获得一个唯一的deliveryTagdeliveryTagchannel范围内是唯一的
    第二个参数multiple:批量确认标志。如果值为true,包含本条消息在内的、所有比该消息deliveryTag值小的 消息都被拒绝了(除了已经被 ack 的以外);如果值为false,只拒绝三本条消息
    第三个参数requeue:表示如何处理这条消息,如果值为true,则重新放入RabbitMQ的发送队列,如果值为false,则通知RabbitMQ销毁这条消息

  1. // 每个客户端每次最后获取N个消息
  2. channel.basicQos(1);

  1.  
  1.  




  1.  * (Wmxg)表控制层
    *
    * @author makejava
    * @since 2021-03-27 23:02:34 结合producetransation 看文档的图片理解
    */
    @Component
    public class OrderMqConsumer {
    /**
    * 服务对象
    */
    private int count=1;
    @Autowired
    private DispatcherService dispatcherService;

    @RabbitHandler
    // @RabbitListener(bindings = @QueueBinding(value = @Queue(value = "order.fanout.exchange",
    // durable = "true",autoDelete = "false"),
    // exchange = @Exchange(value = "order_fanout_exchange",type = ExchangeTypes.FANOUT)))
    @RabbitListener(queues ="order.fanout.exchange")
    public void messageconsumer(String mesg, Channel channel, CorrelationData correlationData, @Header(AmqpHeaders.DELIVERY_TAG)long tag) throws IOException {
    try {
    //1收到消息是
    System.out.println("收到的消息是:" + mesg + ",count=" + count);
    //2获取订单的信息
    Kung kung = JSON.parseObject(mesg, Kung.class);
    //3获取ID
    String orderId = kung.getOrderId();
    String userId = kung.getUserId();
    //4保存运单
    Wmxg wmxg = new Wmxg();
    wmxg.setOrderId(orderId);
    wmxg.setUserId(userId);
  1. //幂等性的问题,存在则更新,不存在则插入 使用分布式锁也可以解决 避免重试时重复派单
    dispatcherService.insert(wmxg);
    System.out.println(1 / 0);

    //对当前消息进行应答
    //用catch进行捕捉
    channel.basicAck(tag,false); //只对当前收到的消息进行确认
    true对消息进行批量确认

  1. } catch (Exception e) {
    //如果出现异常的情况,根据实际情况去进行重发
    //重发一次后,丢失还是日记,库存根据自己的业务场景去定
    //参数1:消息的tag
    // 参数2:false 多条处理
    // 参数3:requeue重发 fasle 不会重发,会把消息打入死信队列(自己建立一个死信队列,如下文书所示) true会进入死循环的重发(造成重复消费),建议true的情况下,不使用try catch 否则造成循环
    channel.basicNack(tag,false,false);

    }
    }

    自己建立的死信队列:
  1. @Bean
    public Queue orderQueue() {
    Map<String,Object> args=new HashMap<>();
    args.put("x-message-ttl",5000);//这里过期时间一定是一个INT类型
    args.put("x-dead-letter-exchange","dead_direct_exchange");//绑定死信队列交换机
    args.put("x-max-length",5);//指定最大接受多少条
    args.put("x-dead-letter-routing-key","dead");//fanout没有key
    return new Queue("order.fanout.exchange", true,false,false,args);
    }
  1.  
  1.  
  1.  
  1.  

rabbitMq消费死循环的更多相关文章

  1. C#多线程技术提高RabbitMQ消费吞吐率

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第二部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...

  2. 提升RabbitMQ消费速度的一些实践

    RabbitMQ是一个开源的消息中间件,自带管理界面友好.开发语言支持广泛.没有对其它中间件的依赖,而且社区非常活跃,特别适合中小型企业拿来就用.这篇文章主要探讨提升RabbitMQ消费速度的一些方法 ...

  3. 由一个RABBITMQ监听器死循环引出的SPRING中BEAN和MAPPER接口的注入问题

    1 @Slf4j 2 @RestController 3 @Component 4 public class VouchersReceiverController implements Message ...

  4. RabbitMQ 消费消息

    1, 创建一个 springboot 项目, 导入依赖(和生产者一致) 2, application.properties (基础配置和生产者一致, 消费者需要再额外配置一些) # rabbitmq ...

  5. rabbitmq消费端加入精确控频。

    控制频率之前用的是线程池的数量来控制,很难控制.因为做一键事情,做一万次,并不是每次消耗的时间都相同,所以很难推测出到底多少线程并发才刚好不超过指定的频率. 现在在框架中加入控频功能,即使开200线程 ...

  6. rabbitmq 生产者 消费者(多个线程消费同一个队列里面的任务。) 一个通用rabbitmq消费确认,快速并发运行的框架。

    rabbitmq作为消息队列可以有消息消费确认机制,之前写个基于redis的通用生产者 消费者 并发框架,redis的list结构可以简单充当消息队列,但不具备消费确认机制,随意关停程序,会丢失一部分 ...

  7. RabbitMQ消费方式汇总

    在学习本章节前,请先学习之前的章节:Java访问RabbitMQ:https://www.cnblogs.com/duanjt/p/10057330.htmlRabbitMQ消息发布时的权衡:http ...

  8. RabbitMQ消费端消息的获取方式(.Net Core)

    1[短链接]:BasicGet(String queue, Boolean autoAck) 通过request的方式独自去获取消息,断开式,一次次获取,如果返回null,则说明队列中没有消息. 隐患 ...

  9. Rabbitmq消费失败死信队列

    Rabbitmq 重消费处理 一 处理流程图: 业务交换机:正常接收发送者,发送过来的消息,交换机类型topic AE交换机: 当业务交换机无法根据指定的routingkey去路由到队列的时候,会全部 ...

随机推荐

  1. 2019版pycharm永久激活

    链接:https://pan.baidu.com/s/1vY1KBvi2NHIgoN8C2qaFbg 提取码:p4gx 1.下对应版本的jar包,放到pycharm目录的bin目录下2.去C:\Use ...

  2. tomcat与springmvc 结合 之---第18篇 StandContext容器和SpringMVC的监听器的模型

    writedby张艳涛 如何使用tomcat的监听器 public class BootStrap_ex06 { public static void main(String[] args) { Ht ...

  3. js学习笔记之公告逐行显示

    $(function(){ var newsListHeight = $(".news-list").height(); //获得内容的高度 var newsConHeight = ...

  4. solr(CVE-2019-17558)远程命令执行

    影响版本 Apache Solr 5.x到8.2.0版本 测试 https://github.com/jas502n/CVE-2019-0193

  5. 论文笔记:(CVPR2017)PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation

    目录 一. 存在的问题 二. 解决的方案 1.点云特征 2.解决方法 三. 网络结构 四. 理论证明 五.实验效果 1.应用 (1)分类: ModelNet40数据集 (2)部件分割:ShapeNet ...

  6. 用QT写的简单Todo记事本-附源码(浮动窗口)

    去年边学边写了搞了很久, 已经好久没继续开发了, 先放出来供大家参考吧. 发现自己的学习能力还是不错的. 技术点: 使用QT, QML技术 代码参考: https://github.com/cnscu ...

  7. 大都市meg DFS序

    题目描述 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n的n个小村庄, ...

  8. 洛谷P3052题解

    题面 看起来非常简单,但是细节多的一批的状压DP入门题. 我设 \(f_i\) 为 \(i\) 状态时最小分组数, \(g_i\) 为 \(i\) 状态时最后一组剩余空间. 对于每一个 \(i\) , ...

  9. DVWA靶场练习-Command Injection命令注入

    Command Injection 原理 攻击者通过构造恶意参数,破坏命令的语句结构,从而达到执行恶意命令的目的.

  10. 大学同学做Java开发比我多5K,八年老Android只会crud该转Java吗?

    最近在网上看到这样一个帖子: 做了八年Android开发,感觉这块做着也挺没意思,日常工作就是做一些架构优化,质量数据监控,改一改构建脚本,最主要的是业务负责人没有一个是做客户端的,都是后端的人. 最 ...