消息中间件--RabbitMQ ---高级特性之消费端ACK与重回队列
什么是消费端的ACK和重回队列?
消费端的手工ACK和NACK
- 消费端进行消费的时候,如果由于业务异常我们可以进行日志的记录,然后进行补偿
- 如果由于服务器宕机等严重问题,那我们就需要手工进行ACK保障费端消费成功!
消费端重回队列
- 消费端重回队列是为了对没有处理成功的消息,把消息重新会递给Broker
- 一般我们在实际应用中,都会关闭重回队列,也就是设置为 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与重回队列相关推荐
- RabbitMQ 高级特性(吐血猝死整理篇)
文章目录 RabbitMQ 高级特性 消息可靠性投递(可靠性发送) 事务机制 代码实现 发送方确认机制 为什么比事务性能好 示例代码 测试一下QPS 持久化存储 TTL 队列 死信队列(DLX) 延迟 ...
- 3 RabbitMQ高级特性 3
主要为大家讲解RabbitMQ的高级特性和实际场景应用, 包括消息如何保障 100% 的投递成功 ? 幂等性概念详解,在海量订单产生的业务高峰期,如何避免消息的重复消费问题? Confirm确认消息. ...
- RabbitMQ(二):RabbitMQ高级特性
RabbitMQ(二):RabbitMQ高级特性 RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用.作为一名合格的开发者,有必要了解一下相关知识,RabbitM ...
- RabbitMQ高级特性(五):RabbitMQ之死信队列DLX
一.死信队列简介 (1)死信队列 死信队列,英文缩写:DLX .Dead Letter Exchange(死信交换机),当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就 ...
- RabbitMQ,Springboot整合RabbitMQ实现 消息可靠性投递,Consumer ACK,TTL,死信队列,使用TTL+死信队列=延迟队列
搭建SpringBoot项目,用于演示 springboot版本 <!-- spring boot --><dependency><groupId>org.spri ...
- 【消息中间件】RabbitMQ 高级特性与应用问题
消息的可靠投递 在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景.RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式. confirm 确认模式 r ...
- RabbitMQ高级特性
文章目录 1. 简述 2. 特性示例: 2.1 消息可靠性投递 2.2 Consumer Ack 2.3 消费端限流 2.4 TTL 2.5 死信队列 2.6 延迟队列 1. 简述 在rabbitMQ ...
- RabbitMQ高级特性——死信队列DLX以及代码测试
大伙可以到我的RabbitMQ专栏获取更多信息 demo示例这里拿 概述 死信队列,缩写DLX(dead letter exchange 死信交换机),当消息称为dead message之后,会被重新 ...
- rabbitmq高级特性(消息手动确认)
为了保证消息不丢失,从生产者两种模式(确认模式和返回模式)到消费者手动确认的一个大整合 生产者 1.maven依赖 <dependency><groupId>org.sprin ...
最新文章
- java B2B2C Springcloud多租户电子商城系统-消息驱动的微服务(消费分区)
- Redis 6.0 新特性 ACL 介绍
- 详解Go语言的计时器
- Protostuff序列化和反序列化
- 2021牛客暑期多校训练营1, 签到题DFBG
- VS 添加代理 -NUGET
- 客户端登陆服务器用户名验证
- Go语言实战+code
- c语言课后编程题第八章答案,C语言课后编程题答案.doc
- 用cubesuite烧写器报下列错误: [Direct Error Cause] Incorrect ID Code.(C0602202)
- 感觉现在的技术圈越来越像娱乐圈了
- 音视频5.1——MediaCodec 同步方式完成AAC硬解成PCM
- Android键盘 AOSP监听delete按键
- 微信公众号 多台服务器,在多台 Linux 服务器上搭建 Pulsar 集群
- cocos2dx 植物大战僵尸 5 塔基Terrain的更新
- 授权(mining.authorize)与 auth_stratum函数
- python执行定时任务
- oracle如何设置归档策略,oracle数据库rman归档设置和管理
- 文本处理工具及正则表达式
- HeidiSQL自动补全表名快捷键设置
热门文章
- 华为鸿蒙ipc时延,虚搜
- 包含几通道数据_温度采集,无处不测!「数据采集」
- $(document).ready(function(){}), $().ready(function(){}) 和 $(function(){}) 三个区别...
- hibernate update sql
- Wolf QOS 教程
- 创业,“玩”的就是心态
- centos关闭邮件提醒
- 微信小程序-上传多张图片加进度条(支持预览、删除)
- Java知识点总结(Java容器-ArrayList)
- #10 Linux硬盘管理