RabbitMQ总结(一)--消息队列RabbitMQ应答模式(自动、手动)
原文链接
消息队列RabbitMQ应答模式(自动、手动)
为了确保消息不会丢失,RabbitMQ支持消息应答。消费者发送一个消息应答,告诉RabbitMQ这个消息已经接收并且处理完毕了。RabbitMQ就可以删除它了。
如果一个消费者挂掉却没有发送应答,RabbitMQ会理解为这个消息没有处理完全,然后交给另一个消费者去重新处理。这样,你就可以确认即使消费者偶尔挂掉也不会丢失任何消息了。
没有任何消息超时限制;只有当消费者挂掉时,RabbitMQ才会重新投递。即使处理一条消息会花费很长的时间。
消息应答是默认打开的。我们通过显示的设置autoAsk=true关闭这种机制。现即自动应答开,一旦我们完成任务,消费者会自动发送应答。通知RabbitMQ消息已被处理,可以从内存删除。如果消费者因宕机或链接失败等原因没有发送ACK(不同于ActiveMQ,在RabbitMQ里,消息没有过期的概念),则RabbitMQ会将消息重新发送给其他监听在队列的下一个消费者。
案例:
生产者端代码不变,消费者端代码这部分就是用于开启手动应答模式的。
channel.basicConsume(QUEUE_NAME, false, defaultConsumer);
注:第二个参数值为false代表关闭RabbitMQ的自动应答机制,改为手动应答。
在处理完消息时,返回应答状态,true表示为自动应答模式。
channel.basicAck(envelope.getDeliveryTag(), false);
应答模式: 自动签收~~~
自动应答: 不在乎消费者对消息处理是否成功,都会告诉队列删除消息。如果处理消息失败,实现自动补偿(队列投递过去 重新处理)。
手动应答: 消费者处理完业务逻辑,手动返回ack(通知)告诉队列处理完了,队列进而删除消息。
生产者代码不变,消费者:
package com.toov5.Consumer;import java.io.IOException;
import java.util.concurrent.TimeoutException;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.toov5.utils.MQConnectionUtils;public class Consumer {//队列名称private static final String QUEUE_NAME = "test_queue";public static void main(String[] args) throws IOException, TimeoutException {System.out.println("消费者启动..........");//创建新的连接Connection connection = MQConnectionUtils.newConnection();//创建ChannelChannel channel = connection.createChannel();// 消费者关联队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);DefaultConsumer defaultConsumerr = new DefaultConsumer(channel) {//监听获取消息@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,byte[] body) throws IOException {String msg =new String(body,"UTF-8");System.out.println("消费者获取生产者消息:"+msg);}};//牵手模式设置 默认自动应答模式 true:自动应答模式 channel.basicConsume(QUEUE_NAME, false, defaultConsumerr);// fanse手动应答 // //关闭通道和连接
// channel.close();
// connection.close();}
}
手动应答。此时 消息队列的消息 一直没有被清除掉
如下修改:
package com.toov5.Consumer;import java.io.IOException;
import java.util.concurrent.TimeoutException;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.toov5.utils.MQConnectionUtils;public class Consumer {//队列名称private static final String QUEUE_NAME = "test_queue";public static void main(String[] args) throws IOException, TimeoutException {System.out.println("消费者启动..........");//创建新的连接Connection connection = MQConnectionUtils.newConnection();//创建Channelfinal Channel channel = connection.createChannel();// 消费者关联队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);DefaultConsumer defaultConsumerr = new DefaultConsumer(channel) {//监听获取消息@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,byte[] body) throws IOException {String msg =new String(body,"UTF-8");System.out.println("消费者获取生产者消息:"+msg);channel.basicAck(envelope.getDeliveryTag(), false); //手动应答 告诉消息队列服务器 消费成功}};//牵手模式设置 默认自动应答模式 true:自动应答模式 channel.basicConsume(QUEUE_NAME, false, defaultConsumerr);// fanse手动应答 // //关闭通道和连接
// channel.close();
// connection.close();}
}
这样就消费完毕了
RabbitMQ总结(一)--消息队列RabbitMQ应答模式(自动、手动)相关推荐
- 消息队列RabbitMQ入门与PHP实战
消息队列介绍以及消息队列应用场景 RabbitMQ 说明 MQ(Message Queue) 即消息队列,是应用间的通信方式,消息发送后可立即返回,由消息系统来确保消息的可靠传递."消息队列 ...
- 干货!消息队列RabbitMQ入门教程
写在前面:全文12000多字,从为什么需要用消息队列,到rabbitMQ安装使用,如何使用JavaAPI生产消费消息,以及使用消息队列带来的一些常见问题.绝对很适合新手入门学习. 为什么需要消息队列 ...
- 消息队列 RabbitMQ
前言 市面上的消息队列产品有很多,比如老牌的 ActiveMQ.RabbitMQ ,目前我看最火的 Kafka ,还有 ZeroMQ ,阿里巴巴捐赠给 Apache 的 RocketMQ ,连 red ...
- 第二百九十二节,RabbitMQ多设备消息队列-Python开发
RabbitMQ多设备消息队列-Python开发 首先安装Python开发连接RabbitMQ的API,pika模块 pika模块为第三方模块 对于RabbitMQ来说,生产和消费不再针对内存里的一 ...
- 消息队列RabbitMQ的使用
最近在学习spring cloud微服务,当学习到spring cloud bus的时候,涉及到了消息队列,需要学习RabbitMQ. 一.消息队列 1.1介绍消息队列 消息队列,即MQ,Messag ...
- 快速掌握消息队列RabbitMQ
※快速掌握消息队列RabbitMQ 一.RabbitMQ概述 (一)什么是消息队列MQ 消息队列(Message Queue),后文称MQ,是一种 跨进程的通信机制,用于上下游传递消息. MQ作为消息 ...
- 谷粒商城12——购物车模块、消息队列RabbitMQ
文章目录 十.购物车模块 1.需求分析 2.封装vo 3.添加商品 4.查询购物车 5.选中商品 6.在购物车修改商品数量 7.在购物车删除商品 十一.消息队列RabbitMQ 1.场景分析 2.概述 ...
- 消息队列、RabbitMQ原理、消息队列保证幂等性,消息丢失,消息顺序性,以及处理消息队列消息积压问题
消息队列 消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已 常见的消息队列 RabbitMq ActiveM ...
- 消息队列 --- RabbitMQ基本概念学习及安装使用
目录 一.基本概念 1.消息队列 1.1 消息队列是什么 1.2 消息队列的模式 1.2.1 点对点模式 1.2.2 发布/订阅模式 1.3 消息队列选型衡量标准 2.RabbitMQ是什么 3.Ra ...
最新文章
- pdf一键转曲_新技能:如何利用PDF制作可变数据!
- 正确配置Linux系统ulimit值的方法【转】
- StoreFront 登陆页面的话持续时间
- python max函数_Python max内置函数详细介绍
- linux卸载mariadb数据库,CentOS yum 安装、卸载MariaDB数据库
- mysql为字段值添加或者去除前缀、后缀(查询字段拼值)
- [转载红鱼儿]kbmmw 开发点滴:kbmMWQuery插入记录
- Activity-数据状态的保存
- 详解MathType中如何插入特殊符号
- JavaScript操作Cookies
- 简单的java程序设计原则和模式
- IDEA 如何根据代码自动生成类图
- matlab中遗传算法代沟,谢菲尔德大学的MATLAB遗传算法
- 拆机专用磁力桌垫:保证一颗螺丝也不漏网
- Spark的下一代引擎-Project Tungsten启示录
- Openwrt GCC 7.5编译sanitizer_internal_defs.h错误
- 2020ICPC 昆明热身赛 C.Statues(小思维)
- 英语论文写作笔记一则
- [生存志] 第71节 阖闾五战入郢
- 学栈和队列时的人生感悟
热门文章
- 精锐系列更改snmp交换机ID 的办法
- QQ感叹号是什么鬼?原来是服务器波动,腾讯官方来辟谣了
- 安装及配置Maven环境变量
- pybullet入门第一节
- 西藏加牙村织毯艺人被俗称为“栽毛匠”/地毯品牌
- DataVisor进入中国一周年 成为人工智能大数据反欺诈行业领先者
- 4.有两个知阵a和b,均为2行3列。求两个矩阵之和。重载运算符“+”,使之能用于知阵相加。如:c=a+b。
- 《成本会计》---标准成本法
- 学习笔记(01):SAS数据分析:从入门到企业实战-SAS宏函数:通用
- Java ppt转图片部署到Linux 乱码