原文链接

消息队列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应答模式(自动、手动)相关推荐

  1. 消息队列RabbitMQ入门与PHP实战

    消息队列介绍以及消息队列应用场景 RabbitMQ 说明 MQ(Message Queue) 即消息队列,是应用间的通信方式,消息发送后可立即返回,由消息系统来确保消息的可靠传递."消息队列 ...

  2. 干货!消息队列RabbitMQ入门教程

    ​写在前面:全文12000多字,从为什么需要用消息队列,到rabbitMQ安装使用,如何使用JavaAPI生产消费消息,以及使用消息队列带来的一些常见问题.绝对很适合新手入门学习. 为什么需要消息队列 ...

  3. 消息队列 RabbitMQ

    前言 市面上的消息队列产品有很多,比如老牌的 ActiveMQ.RabbitMQ ,目前我看最火的 Kafka ,还有 ZeroMQ ,阿里巴巴捐赠给 Apache 的 RocketMQ ,连 red ...

  4. 第二百九十二节,RabbitMQ多设备消息队列-Python开发

    RabbitMQ多设备消息队列-Python开发 首先安装Python开发连接RabbitMQ的API,pika模块 pika模块为第三方模块  对于RabbitMQ来说,生产和消费不再针对内存里的一 ...

  5. 消息队列RabbitMQ的使用

    最近在学习spring cloud微服务,当学习到spring cloud bus的时候,涉及到了消息队列,需要学习RabbitMQ. 一.消息队列 1.1介绍消息队列 消息队列,即MQ,Messag ...

  6. 快速掌握消息队列RabbitMQ

    ※快速掌握消息队列RabbitMQ 一.RabbitMQ概述 (一)什么是消息队列MQ 消息队列(Message Queue),后文称MQ,是一种 跨进程的通信机制,用于上下游传递消息. MQ作为消息 ...

  7. 谷粒商城12——购物车模块、消息队列RabbitMQ

    文章目录 十.购物车模块 1.需求分析 2.封装vo 3.添加商品 4.查询购物车 5.选中商品 6.在购物车修改商品数量 7.在购物车删除商品 十一.消息队列RabbitMQ 1.场景分析 2.概述 ...

  8. 消息队列、RabbitMQ原理、消息队列保证幂等性,消息丢失,消息顺序性,以及处理消息队列消息积压问题

    消息队列 消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已 常见的消息队列 RabbitMq ActiveM ...

  9. 消息队列 --- RabbitMQ基本概念学习及安装使用

    目录 一.基本概念 1.消息队列 1.1 消息队列是什么 1.2 消息队列的模式 1.2.1 点对点模式 1.2.2 发布/订阅模式 1.3 消息队列选型衡量标准 2.RabbitMQ是什么 3.Ra ...

最新文章

  1. pdf一键转曲_新技能:如何利用PDF制作可变数据!
  2. 正确配置Linux系统ulimit值的方法【转】
  3. StoreFront 登陆页面的话持续时间
  4. python max函数_Python max内置函数详细介绍
  5. linux卸载mariadb数据库,CentOS yum 安装、卸载MariaDB数据库
  6. mysql为字段值添加或者去除前缀、后缀(查询字段拼值)
  7. [转载红鱼儿]kbmmw 开发点滴:kbmMWQuery插入记录
  8. Activity-数据状态的保存
  9. 详解MathType中如何插入特殊符号
  10. JavaScript操作Cookies
  11. 简单的java程序设计原则和模式
  12. IDEA 如何根据代码自动生成类图
  13. matlab中遗传算法代沟,谢菲尔德大学的MATLAB遗传算法
  14. 拆机专用磁力桌垫:保证一颗螺丝也不漏网
  15. Spark的下一代引擎-Project Tungsten启示录
  16. Openwrt GCC 7.5编译sanitizer_internal_defs.h错误
  17. 2020ICPC 昆明热身赛 C.Statues(小思维)
  18. 英语论文写作笔记一则
  19. [生存志] 第71节 阖闾五战入郢
  20. 学栈和队列时的人生感悟

热门文章

  1. 精锐系列更改snmp交换机ID 的办法
  2. QQ感叹号是什么鬼?原来是服务器波动,腾讯官方来辟谣了
  3. 安装及配置Maven环境变量
  4. pybullet入门第一节
  5. 西藏加牙村织毯艺人被俗称为“栽毛匠”/地毯品牌
  6. DataVisor进入中国一周年 成为人工智能大数据反欺诈行业领先者
  7. 4.有两个知阵a和b,均为2行3列。求两个矩阵之和。重载运算符“+”,使之能用于知阵相加。如:c=a+b。
  8. 《成本会计》---标准成本法
  9. 学习笔记(01):SAS数据分析:从入门到企业实战-SAS宏函数:通用
  10. Java ppt转图片部署到Linux 乱码