什么是消费端的ACK和重回队列?

消费端的手工ACK和NACK

  1. 消费端进行消费的时候,如果由于业务异常我们可以进行日志的记录,然后进行补偿
  2. 如果由于服务器宕机等严重问题,那我们就需要手工进行ACK保障费端消费成功!

消费端重回队列

  1. 消费端重回队列是为了对没有处理成功的消息,把消息重新会递给Broker
  2. 一般我们在实际应用中,都会关闭重回队列,也就是设置为 False

生产端代码

package com.bfxy.rabbitmq.api.ack;import java.util.HashMap;
import java.util.Map;import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class Producer {public static void main(String[] args) throws Exception {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("localhost");
//      connectionFactory.setHost("192.168.43.223");connectionFactory.setPort(5672);connectionFactory.setVirtualHost("/");connectionFactory.setUsername("guest");connectionFactory.setPassword("guest");Connection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();String exchange = "test_ack_exchange";String routingKey = "ack.save";for(int i =0; i<5; i ++){Map<String, Object> headers = new HashMap<String, Object>();headers.put("num", i);AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder().deliveryMode(2).contentEncoding("UTF-8").headers(headers).build();String msg = "Hello RabbitMQ ACK Message " + i;channel.basicPublish(exchange, routingKey, true, properties, msg.getBytes());}}
}

消费者

package com.bfxy.rabbitmq.api.ack;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.QueueingConsumer.Delivery;public class Consumer {public static void main(String[] args) throws Exception {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("localhost");
//      connectionFactory.setHost("192.168.43.223");connectionFactory.setPort(5672);connectionFactory.setVirtualHost("/");connectionFactory.setUsername("guest");connectionFactory.setPassword("guest");Connection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();String exchangeName = "test_ack_exchange";String queueName = "test_ack_queue";String routingKey = "ack.#";channel.exchangeDeclare(exchangeName, "topic", true, false, null);channel.queueDeclare(queueName, true, false, false, null);channel.queueBind(queueName, exchangeName, routingKey);// 手工签收 必须要关闭 autoAck = falsechannel.basicConsume(queueName, false, new MyConsumer(channel));}
}
package com.bfxy.rabbitmq.api.ack;import java.io.IOException;import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;public class MyConsumer extends DefaultConsumer {private Channel channel ;public MyConsumer(Channel channel) {super(channel);this.channel = channel;}@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.err.println("-----------consume message----------");System.err.println("body: " + new String(body));try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}if((Integer)properties.getHeaders().get("num") == 0) {channel.basicNack(envelope.getDeliveryTag(), false, true);} else {channel.basicAck(envelope.getDeliveryTag(), false);}}
}

运行结果:

重回队列,回到队列末尾

有一条消息没有被消费

消息中间件--RabbitMQ ---高级特性之消费端ACK与重回队列相关推荐

  1. RabbitMQ 高级特性(吐血猝死整理篇)

    文章目录 RabbitMQ 高级特性 消息可靠性投递(可靠性发送) 事务机制 代码实现 发送方确认机制 为什么比事务性能好 示例代码 测试一下QPS 持久化存储 TTL 队列 死信队列(DLX) 延迟 ...

  2. 3 RabbitMQ高级特性 3

    主要为大家讲解RabbitMQ的高级特性和实际场景应用, 包括消息如何保障 100% 的投递成功 ? 幂等性概念详解,在海量订单产生的业务高峰期,如何避免消息的重复消费问题? Confirm确认消息. ...

  3. RabbitMQ(二):RabbitMQ高级特性

    RabbitMQ(二):RabbitMQ高级特性 RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用.作为一名合格的开发者,有必要了解一下相关知识,RabbitM ...

  4. RabbitMQ高级特性(五):RabbitMQ之死信队列DLX

    一.死信队列简介 (1)死信队列 死信队列,英文缩写:DLX .Dead Letter Exchange(死信交换机),当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就 ...

  5. RabbitMQ,Springboot整合RabbitMQ实现 消息可靠性投递,Consumer ACK,TTL,死信队列,使用TTL+死信队列=延迟队列

    搭建SpringBoot项目,用于演示 springboot版本 <!-- spring boot --><dependency><groupId>org.spri ...

  6. 【消息中间件】RabbitMQ 高级特性与应用问题

    消息的可靠投递 在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景.RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式. confirm 确认模式 r ...

  7. RabbitMQ高级特性

    文章目录 1. 简述 2. 特性示例: 2.1 消息可靠性投递 2.2 Consumer Ack 2.3 消费端限流 2.4 TTL 2.5 死信队列 2.6 延迟队列 1. 简述 在rabbitMQ ...

  8. RabbitMQ高级特性——死信队列DLX以及代码测试

    大伙可以到我的RabbitMQ专栏获取更多信息 demo示例这里拿 概述 死信队列,缩写DLX(dead letter exchange 死信交换机),当消息称为dead message之后,会被重新 ...

  9. rabbitmq高级特性(消息手动确认)

    为了保证消息不丢失,从生产者两种模式(确认模式和返回模式)到消费者手动确认的一个大整合 生产者 1.maven依赖 <dependency><groupId>org.sprin ...

最新文章

  1. java B2B2C Springcloud多租户电子商城系统-消息驱动的微服务(消费分区)
  2. Redis 6.0 新特性 ACL 介绍
  3. 详解Go语言的计时器
  4. Protostuff序列化和反序列化
  5. 2021牛客暑期多校训练营1, 签到题DFBG
  6. VS 添加代理 -NUGET
  7. 客户端登陆服务器用户名验证
  8. Go语言实战+code
  9. c语言课后编程题第八章答案,C语言课后编程题答案.doc
  10. 用cubesuite烧写器报下列错误: [Direct Error Cause] Incorrect ID Code.(C0602202)
  11. 感觉现在的技术圈越来越像娱乐圈了
  12. 音视频5.1——MediaCodec 同步方式完成AAC硬解成PCM
  13. Android键盘 AOSP监听delete按键
  14. 微信公众号 多台服务器,在多台 Linux 服务器上搭建 Pulsar 集群
  15. cocos2dx 植物大战僵尸 5 塔基Terrain的更新
  16. 授权(mining.authorize)与 auth_stratum函数
  17. python执行定时任务
  18. oracle如何设置归档策略,oracle数据库rman归档设置和管理
  19. 文本处理工具及正则表达式
  20. HeidiSQL自动补全表名快捷键设置

热门文章

  1. 华为鸿蒙ipc时延,虚搜
  2. 包含几通道数据_温度采集,无处不测!「数据采集」
  3. $(document).ready(function(){}), $().ready(function(){}) 和 $(function(){}) 三个区别...
  4. hibernate update sql
  5. Wolf QOS 教程
  6. 创业,“玩”的就是心态
  7. centos关闭邮件提醒
  8. 微信小程序-上传多张图片加进度条(支持预览、删除)
  9. Java知识点总结(Java容器-ArrayList)
  10. #10 Linux硬盘管理