简介

参考官方文档: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. CentOS7下查询硬件信息
  2. 2020-12-16(虚析构函数,神逻辑代码)
  3. Django从理论到实战(part21)--自定义模板过滤器
  4. c语言高中while题目,东风一中高中生智能机器人班c语言上机试题.doc
  5. php实习生很苦吗,实习生就该被欺负做又累又苦的活吗?!
  6. 面试题12:打印1到最大的n位数
  7. 艾默生变频器ev1000故障代码_国产变频器型号大全,梳理国产变频的前世今生!...
  8. 提高抗打击能力_孩子抗挫能力差,巧用4个小窍门,引导孩子将“危”化为“机”...
  9. javascript 函数整理
  10. excel小写转大写公式_Word如何一键转PPT/Excel,来看看用对的方式操作office有多方便...
  11. 更改计算机用户名后无法共享文件夹,怎样使文件夹不被共享
  12. 大数据与Hadoop的区别
  13. org.apache.commons.lang.text.StrLookup缺失
  14. 【Matlab】图像裁剪函数imcrop的原点、长度、宽度问题
  15. add_days oracle_Oracle日期函数简介
  16. Vue组件通信(父传子、子传父、兄弟通信)
  17. Python深度学习-快速指南
  18. python中 [ ] 的使用方法
  19. 数字逻辑:重要基础知识点整理(不定时更新)
  20. CSDN创建二级专栏并迁移博客

热门文章

  1. 切片法分割树冠与树干
  2. 系统安全之利用操作系统自带命令杀毒
  3. mac虚拟机服务器设置u盘启动不了,手把手教你解决win7系统苹果电脑运行虚拟机后无法识别显示U盘的图文方案...
  4. 编译原理大作业-PL0语言编译器
  5. 本地php开发环境出现 cURL error 60
  6. Redis -- 缓存穿透和雪崩
  7. flutter app安卓应用开机自启动
  8. 【Git下载安装与环境配置】
  9. 2017中国软件技术大会圆满闭幕
  10. 关于Android中的画笔画画