前言

rabbitmq作为现在流行的消息队列,它拥有流量削峰、应用解耦、异步处理等优点,使用数量也是较多的。其中重要的特性也就是手动应答避免消息丢失的特点更是使其更上一层楼。消息队列基础的处理流程是:生产者—》队列—》消费者。

应答机制

rabbitmq的自动应答会导致在消息的分发途中,如果一台消费者角色的服务器宕机了,其处理的消息在自动应答模式下就会丢失,而手动应答则不会,而且退回队列分发给下一个消费者进行处理,有效的规避了因服务器宕机而造成的消息丢失。接下来进行代码演示

生产者

首先我们进行创建一个生产者进行消息的输入:

public class Task02 {private final static String TASK_QUEUE_NAME="queue01";public static void main(String[] args) throws IOException, TimeoutException {Channel channel = RabbitMQUtils.getChannel();channel.queueDeclare(TASK_QUEUE_NAME,true,false,false,null);Scanner scanner = new Scanner(System.in);while (scanner.hasNext()){String message = scanner.next();channel.basicPublish("",TASK_QUEUE_NAME,null,message.getBytes("UTF-8"));System.out.println("生产者发出的消息是:"+message);}}
}

消费者

紧接着编写消费者的代码:
消费者1号

public class Work01 {private final static String TASK_QUEUE_NAME="queue01";public static void main(String[] args) throws IOException, TimeoutException {Channel channel = RabbitMQUtils.getChannel();System.out.println("消费者1号等待接收消息处理时间较短!");DeliverCallback deliverCallback=(String consumerTag, Delivery message)->{//挂起一秒try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("接收到的消息是:"+new String(message.getBody(),"UTF-8"));//手动应答操作/*** 第一个参数:tag消息的标记* 第二个参数:是否批量处理,手动应答就为false*/channel.basicAck(message.getEnvelope().getDeliveryTag(),false);};CancelCallback cancelCallback=(String consumerTag)->{System.out.println(consumerTag+"消费者消费信息被终止!");};//采用手动应答boolean autoAck=false;channel.basicConsume(TASK_QUEUE_NAME,autoAck,deliverCallback,cancelCallback);}
}

消费者2号:

public class Work02 {private final static String TASK_QUEUE_NAME="queue01";public static void main(String[] args) throws IOException, TimeoutException {Channel channel = RabbitMQUtils.getChannel();System.out.println("消费者2号等待接收消息处理时间较短!");DeliverCallback deliverCallback=(String consumerTag, Delivery message)->{//挂起一秒try {Thread.sleep(30000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("接收到的消息是:"+new String(message.getBody(),"UTF-8"));//手动应答操作/*** 第一个参数:tag消息的标记* 第二个参数:是否批量处理,手动应答就为false*/channel.basicAck(message.getEnvelope().getDeliveryTag(),false);};CancelCallback cancelCallback=(String consumerTag)->{System.out.println(consumerTag+"消费者消费信息被终止!");};//采用手动应答boolean autoAck=false;channel.basicConsume(TASK_QUEUE_NAME,autoAck,deliverCallback,cancelCallback);}
}

测试

以上代码写完后我们依次点击运行,我们打开rabbitmq的web管理页面会发现刚刚创建得队列,这个队列就是一个消息队列,生产者所发送的消息首先会通过一个连接中的某个信道传输到队列中进行排列等待出队列,每个消息在出队列时又通过信道轮次传输到消费者进行消费。所以这个队列是很重要的,我们可以通过对其观察消息的输入输出的变化等相关信息。

接着我们发两条信息进行验证两个消费者是否可以正常进行消费:

然后检查消费者消费情况,观察是否正常消费:


1号消费者立即就收到了消息,2号因为设置了挂起30秒所以30后收到了消息,接着我们做一个测试,就是在2号消费者接收到消息处理时,关掉它造成服务器宕机,检测消息是否被1号消费者消费或是丢失。

结果

经过测试在2号服务器宕机之后,消息并未丢失而且重新回到队列轮次被1号消费者消费,这样以来就不会存在消息丢失问题,所以消息队列中一般多推荐使用手动应答防止消息丢失从而造成损失。

Rabbitmq手动应答代码实现与测试相关推荐

  1. [RabbitMQ]消息应答概念_消息手动应答代码

    消息应答 概念 消费者完成一个任务可能需要一段时间,如果其中一个消费者处理一个长的任务并仅只完成了部分突然它挂掉了,会发生什么情况.RabbitMQ 一旦向消费者传递了一条消息,便立即将该消 息标记为 ...

  2. RabbitMQ手动应答机制-案例代码梳理

    目录 消息应答 1.概念 2.自动应答 3.手动应答 4.手动批量应答(Multiple) 5.消息自动重新入队 6.手动应答代码实现 7.源码地址 消息应答 参考代码:https://gitee.c ...

  3. Rabbitmq简单模式和消息的手动应答以及Rabbitmq持久化

    Hello模式 在idea中新建一个空工程 设置项目 添加模块 选择模块类型 设置模块 在pom文件中导入jar包依赖 书写生产者代码: public class HelloProduct {// 创 ...

  4. RabbitMQ之消息的自动应答、手动应答和消息持久化(Java开发)

    1.消息的自动和手动应答 boolean autoAck = true;//消息自动应答 channel.basicConsume(WQ_QUEUE,autoAck,consumer); 默认情况下, ...

  5. MQ消息的自动应答和手动应答| RabbitMQ系列(三)

    相关文章 RabbitMQ系列汇总:RabbitMQ系列 前言 开始消息应答之前先思考几个问题 消费者完成一个任务可能需要一段时间,如果其中一个消费者处理一个长的任务并仅只完成 了部分突然它挂掉了,会 ...

  6. RabbitMQ之手动应答消息(消息不丢失)

    RabbitMQ之手动应答消息 1.为什么需要手动应答 当消费者完成一个任务需要一段时间,如果其中一个消费者处理一个长的任务并且只处理了部分突然他挂掉了,会发生什么情况.RabbitMQ一旦向消费者传 ...

  7. RabbitMQ消息应答实战(针对自动|手动应答常见问题进行模拟)

    消息应答概念 消费者完成一个任务可能需要一段时间,如果其中一个消费者处理一个长的任务并仅只完成了部分突然它挂掉了,会发生什么情况.RabbitMQ 一旦向消费者传递了一条消息,便立即将该消息标记为删除 ...

  8. SpringBoot整合RabbitMQ(六大消息模式、消息手动应答机制)

    目录 1.环境搭建 2.队列模式 3.发布订阅模式 4.路由模式 5.主题模式 6.消息手动应答机制 7.回调函数-确认机制(发布确认模式) 1.环境搭建 引入pom: <!-- rabbitM ...

  9. RabbitMQ消息手动应答生产者

    /** 消息在手动应答时是不丢失.放回队列中重新消费* */public class Task2 {// 队列名称public static final String TASK_QUEUE_NAME ...

最新文章

  1. Java注解是如何工作的?
  2. 【杭电多校2020】Go Running【几何】【最小点覆盖】
  3. c语言sort函数排序二维数组,c++ - 如何使用stl sort函数根据第二列对二维数组进行排序? - 堆栈内存溢出...
  4. 计算机课本ppt,计算机基础知识培训教材(ppt44页) .pptx
  5. [导入]ASP.NET2.0中Tabs的简单实现
  6. opencv linux 编译好,linux下编译opencv
  7. accel-pptp 部署
  8. 非常的好的协同过滤入门文章(ZZ)
  9. MFC学习(实时更新)
  10. 局域网桌面监控软件_如何促进局域网监控软件在企业中的普及
  11. 微信appid、openid、unionid的区别和关联
  12. redis字符串的创建,set、mset、setex、setnx
  13. 怎么调大计算机浏览器内字体,电脑网页字体大小怎么调整(电脑里点击哪个是变换字体的)...
  14. RE写作Issue问题题库分析与提纲
  15. 【WIN】svchost与共享进程服务
  16. MySQL8 设置远程访问授权
  17. 没有全景相机,普通人如何用krpano做属于自己的全景图
  18. 实现strncmp函数
  19. 对渗透测试工程师来说,学历重要嘛?
  20. 基于C#的机器学习--c# .NET中直观的深度学习

热门文章

  1. camera 照相机 摄像机
  2. [Python工具]pdf表格提取camelot安装教程
  3. python基础day-08:字符串
  4. 125种滤镜:GPUImage
  5. 1.安装msys64_2、vs2017编译ffmpeg
  6. python抓取抖音评论_一篇文章教会你用Python抓取抖音app热点数据
  7. Keycloak自定义实现第三方登录
  8. 【linux】云服务器的密钥登陆与密码登录相关注意事项
  9. WIN10+CUDA 10.2+CUDNN v8.0安装配置
  10. centos 7 升级 git 版本(通过安装 ius 源的方式)