简介

参考官方文档:link
消费者确认机制是基于数据安全的考虑。当rabbitmq将消息发送给消费者进行消费时,消费者可能会消费消息失败的情况,用户可以设置消费失败的消息给其他消费者消费或者直接丢弃。

消费者确认模式

自动确认模式积极的一面是能够拥有更高的吞吐量,但是却存在数据安全的问题。开启自动确认后,队列中的数据在给消费者后就认为是成功的处理了数据,因此会立马将队列里面的数据进行删除。当消费者在消费消息时出现了异常,这些数据就会进行丢失。因此,一般情况下我们都需要手动确认去保证数据的安全性。

1.basicAck

basicAck方法是肯定的交付,一般在该消息处理完后执行,该消息才会在队列里面被删除,不然会处于UnAcked的状态存在队列中。
其方法有两个参数:
参数1:消费消息的index
参数2: 是否批量确认消息,前提是在同一个channel里面,且是在该消息确认前没有被确认的消息才能批量确认。

public class Recv1 {public static void main(String[] args) throws IOException {Connection connection = MqUtil.getConnection();final Channel channel = connection.createChannel();channel.queueDeclare("work",true,false,false,null);// 设置通道的预取数量为1,官方推荐100到300,数据会影响其吞吐量channel.basicQos(10);// 关闭消息的自动确认机制channel.basicConsume("work", false, new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println(new String(body));// 在处理完消息后手动进行确认/** 参数1: 消费消息的index* 参数2: 是否批量进行确认* */channel.basicAck(envelope.getDeliveryTag(), false);}});}
}

2.basicReject

basicReject是否定的交付,一般在消费消息时出现异常等的时候执行。可以将该消息丢弃或重排序去重新处理消息
其方法有两个参数:
参数1: 消费消息的index
参数2: 对异常消息的处理,true表示重排序,false表示丢弃

public class Recv1 {public static void main(String[] args) throws IOException {Connection connection = MqUtil.getConnection();final Channel channel = connection.createChannel();channel.queueDeclare("work",true,false,false,null);// 设置通道的预取数量为1,官方推荐100到300,数据会影响其吞吐量channel.basicQos(10);// 关闭消息的自动确认机制channel.basicConsume("work", false, new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {try {System.out.println(new String(body) + "----" + envelope.getDeliveryTag());// 在处理完消息后手动进行确认/** 参数1: 消息标签* 参数2: 是否批量进行确认* */channel.basicAck(envelope.getDeliveryTag(), true);} catch (Exception e) {channel.basicReject(envelope.getDeliveryTag(), false);}}});}
}

3.basicNack

basicNack也是否定的交付,其功能和basicReject是一样的。区别是basicNack比basicReject的功能更强一些。他能够一次丢弃多个或重排序多个消息
其方法有三个参数:
参数1:消费消息的index
参数2:是否批量否定多个消息,设为false就与basicReject功能一样,triue的前提也是在同一个channel,且在该消息否定前存在未确认的消息
参数3: 对异常消息的处理,true表示重排序,false表示丢弃

public class Recv1 {public static void main(String[] args) throws IOException {Connection connection = MqUtil.getConnection();final Channel channel = connection.createChannel();channel.queueDeclare("work",true,false,false,null);// 设置通道的预取数量为1,官方推荐100到300,数据会影响其吞吐量channel.basicQos(10);// 关闭消息的自动确认机制channel.basicConsume("work", false, new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {try {System.out.println(new String(body) + "----" + envelope.getDeliveryTag());// 在处理完消息后手动进行确认/** 参数1: 消息标签* 参数2: 是否批量进行确认* */channel.basicAck(envelope.getDeliveryTag(), true);} catch (Exception e) {channel.basicNack(envelope.getDeliveryTag(), false,true);}}});}
}

通道的预取设置

预取设置其含义是允许该通道未确认交付的最大数量。一旦达到该值,rabbitmq将不再往该消费者传递更多的消息。其好处是能够避免内存消耗过大,合理的设置预取值能够增加其吞吐量。官方推荐100到300之间可提供最佳的吞吐量。实际需要反复测试确定。代码参考上面,已经进行过设置

channel.basicQos(10);

7.消费者的确认机制相关推荐

  1. springboot 与rabbitmq集成+生产者投递确认+消费者手动确认+TTL+死信队列+延时队列

    1.生产者的消息可靠性投递机制 1)springboot yml文件配置 spring:rabbitmq:host: 10.0.23.83username: lifwepassword: 123456 ...

  2. activemq 消息阻塞优化和消息确认机制优化

    一.消息阻塞优化 1.activemq消费者在从待消费队列中获取消息是会先进行预读取,默认是1000条(prefetch=1000).这样很容易造成消息积压. 2.可以通过设置prefetch的默认值 ...

  3. springboot + rabbitmq 用了消息确认机制,感觉掉坑里了

    最近部门号召大伙多组织一些技术分享会,说是要活跃公司的技术氛围,但早就看穿一切的我知道,这 T M 就是为了刷KPI.不过,话说回来这的确是件好事,与其开那些没味的扯皮会,多做技术交流还是很有助于个人 ...

  4. RabbitMQ(八):SpringBoot 整合 RabbitMQ(三种消息确认机制以及消费端限流)

    说明 本文 SpringBoot 与 RabbitMQ 进行整合的时候,包含了三种消息的确认模式,如果查询详细的确认模式设置,请阅读:RabbitMQ的三种消息确认模式 同时消费端也采取了限流的措施, ...

  5. RabbitMQ之消息确认机制(事务+Confirm)

    概述 在使用RabbitMQ的时候,我们可以通过消息持久化操作来解决因为服务器的异常奔溃导致的消息丢失,除此之外我们还会遇到一个问题,当消息的发布者在将消息发送出去之后,消息到底有没有正确到达brok ...

  6. java确认rabbitmq_RabbitMQ 消息确认机制

    生产端 Confirm 消息确认机制 消息的确认,是指生产者投递消息后,如果 Broker 收到消息,则会给我们生产者一个应答.生产者进行接收应答,用来确定这条消息是否正常的发送到 Broker ,这 ...

  7. RabbitMQ消息确认机制

    文章目录 1. 事务机制 2. Confirm模式 2.1 生产者 2.1.1 普通Confirm模式 2.1.2 批量Confirm模式 2.1.3 异步Confirm模式 2.2 消费者 3. 其 ...

  8. RabbitMQ的消息确认机制

    转:https://www.toutiao.com/a6583957771840913934/?tt_from=mobile_qq&utm_campaign=client_share& ...

  9. rabbitmq消息确认机制及死信队列的使用

    关于rabbitmq的基本概念和相关的理论这里就不做过多介绍了,在之前的篇幅中有过相应的介绍,也可以查询一些资料详细了解一下rabbitmq的基础知识,下面要介绍的点主要包括两个方面, 1.rabbi ...

最新文章

  1. 织梦添加幻灯片的方法
  2. adreno-gpu-profiler
  3. Rancher搭建集群
  4. 在移动端项目中使用vconsole
  5. 设置vs2008代码区的背景色
  6. oracle trace详解,Oracle autotrace参数详解
  7. virtuaBox 连接不上解决办法
  8. 锁表 for update
  9. linux解决Tomcat内存溢出
  10. VMware-Esxi7.0各个版本镜像文件iso下载链接
  11. 机器学习实战一——朴素贝叶斯中文情感分类模型
  12. UVA 11572 唯一的雪花 Unique Snowflakes
  13. Timeboxing——业界大佬都在用的时间管理法
  14. 在html中怎样写年月日的代码,注册时选择出生年月日的html+JS
  15. [柒穆雨]学习ps有什么用?
  16. 文档查看器GroupDocs.Viewer V17.11发布 | 附下载
  17. 删除磁盘上的表空间后再删除数据库中的表空间——ORA-01549:表空间非空,请使用including contents选项
  18. PDF文件解密方法是什么?PDF转换器有什么优点?
  19. SIwave仿真手册——信号完整性仿真之背钻、模型添加、HFSS求解区域的划分(三)
  20. mysql version pom_Maven的pom文件里,类似于这种版本号${spring.version} 是什么意思?...

热门文章

  1. Flutter-RefreshIndicator不能下拉刷新
  2. Redis Module 模块组件
  3. 空间实景三维激光点云数据处理服务来了!
  4. Manjaro 个人新装配置
  5. 计算机室在初中英语教学中的应用,信息技术在初中英语教学中的应用探析
  6. Java面向对象期末备考
  7. vue 路由三种写法方式
  8. c语言资料大全收集,C语言库函数大全(收集资料).pdf
  9. 2021 国内外 IoT 物联网平台汇总
  10. 图像处理入门和UltraLAB P620系列全能型、高性能、静音级便携工作站