RabbitMq - Java客户端基础【简单案例 +Work模型】

目录

 1、前置知识

1.1、AMQP怎么理解

1.2、Spring AMQP是什么

1.3、为什么要了解Spring-AMQP?

2、使用Spring-AMQP实现一个发消息案例

3、Work模型

问题:

优化:

小结:Work模型的使用:


 1、前置知识

1.1、AMQP怎么理解

  • 全称:Advance Message Queuing Protocol
  • 用途:用于在应用程序之间传递业务消息的开放标准;
  • 该协议与语言、平台无关,更符合微服务中独立性的要求

1.2、Spring AMQP是什么

  • Spring AMQP是基于AMQP协议定义的一套API规范,提供了模版来发送和接收消息;
  • 包含两部分,其中spring-amqp是基础抽象(接口),spring-rabbit是底层的默认实现(实现)

        也就是说,你在使用中,只需要调用Spring AMQP提供的接口就可以了,而Spring AMQP的底层是使用AMQP的(可以理解为AMQP是一种思想,Spring AMQP是它的实现);

1.3、为什么要了解Spring-AMQP?

        RabbitMq给java提供的原生的一些使用方法,过于的复杂不便于日常开发的使用,而Spring-AMQP对RabbitMQ进行了一层封装,让我们在使用中更加的简洁了~


2、使用Spring-AMQP实现一个发消息案例

案例 - 黑马课程中的一个简单的微服务~

需求如下:

  • 利用控制台创建队列demo1.queue
  • 在publisher服务中,利用SpringAMQP直接向demo1.queue发送消息
  • 在consumer服务中,利用SpringAMQP编写消费者,监听demo1.queue队列
  • 这个案例先不考虑交换机~

准备一个项目,我的项目目录如下:

步骤一:在控制台中新建一个demo1.queue队列

注:不会创建的可以看我的上一篇文章~

步骤二:父工程中引入AMQP的依赖

        <!--AMQP依赖,包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>

注:父工程中引入了,他的两个子工程都可以使用~ 

步骤三:配置RabbitMQ服务端信息

需要在每个微服务中引入MQ服务端信息,这样微服务才能连接到RabbitMQ,配置如下:

spring:rabbitmq:host: env-baseport: 5672virtual-host: /username: rootpassword: 1111

具体信息,需要根据你自己电脑的信息修改哦~

步骤四:发送消息

        正常是在业务中发送消息,我们这里为了便于快速看到结果,就在publisher下的单元测试中模拟发送(效果一样)~

@SpringBootTest
public class AMQPTest {@Autowiredprivate RabbitTemplate rabbitTemplate;@Testpublic void testdemo1(){//队列名String queueName = "demo1.queue";//消息String message = "are you ok ?";//发送消息rabbitTemplate.convertAndSend(queueName, message);}
}

步骤五:接收消息

        接收消息是需要长期监控着队列,因此我们写在consumer服务下业务代码中即可~

@Component
public class ListenAMQP {@RabbitListener(queues = "demo1.queue")public void listenDemo1(String msg){System.out.println("接收到消息:" +msg);}
}

步骤六:启动项目(consumer) - 启动后再执行publisher下的单元测试

观察到的结果如下:


3、Work模型

我们使用案例来理解work模型~

模拟WorkQueue,实现一个队列绑定多个消费者

需求如下:

  • 在RabbitMQ的控制台创建一个队列 - work.queue
  • 在publisher服务中定义测试方法,在1秒内产生50条消息,发送到work.queue
  • 在consumer服务中定义两个消息监听者,都监听work.queue队列
  • 消费者1秒处理50条消息,消费者2每秒处理5条消息

创建队列就不说了,我们来看代码:

publisher中的代码(同上,使用单元测试来模拟):

    @Testpublic void testwork() throws InterruptedException {//队列名String queueName = "work.queue";for (int i = 1; i <= 50 ;i++){rabbitTemplate.convertAndSend(queueName, "work消息 --- " + i);Thread.sleep(20);}}

consumer代码:

    @RabbitListener(queues = "work.queue")public void listenwork1(String msg){System.out.println("接收到消息:" + msg);}@RabbitListener(queues = "work.queue")public void listenwork2(String msg){System.err.println("接收到消息:" + msg);}

结果:

上面打印时,我将两个消费者使用不同的颜色打印:

我们会看到消息是一人一个,很均匀有序的划分~

我们把每个消费者处理的速度控制一下:

再观察结果:

虽然顺序不太一样了,还好像依然是一人一个的划分,即使其中一个消费者比另一个消费的更快~

问题:

        消费者的消息推送有一定限制,在默认情况下,RabbitMQ会将消息依次投递给绑定在队列上的每一个消费者,但是这并没有考虑到消费者是否已经处理完消息,可能会出现消息堆积

优化:

        修改application.yml,设置preFetch的值为1,确保同一时刻最多投递给消费者1条消息,一条处理完了,才会收到下一条~

运行结果,能者多劳:

小结:Work模型的使用:

  • 多个消费者绑定到一个队列,可以加快消息处理速度(解决消息堆积问题)
  • 同一条消息只会被一个消费者处理
  • 通过设置prefetch来控制消费者预取的消息数量,处理完一条再处理下一题,实现能者多劳

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/371520.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简介空间复杂度

我们承接上一篇博客。我们写了时间复杂度之后&#xff0c;我们就要来介绍一下另一个相关复杂度了。空间复杂度。我觉得大家应该对空间复杂度认识可能比较少一些。我就是这样&#xff0c;我很少看见题目中有明确要求过空间复杂度的。但确实有这个是我们不可忽视的&#xff0c;所…

ID3算法决策树

步骤&#xff1a; 先计算出信息量&#xff1b;信息熵&#xff1b;信息增量&#xff1b; 再比较信息增量的大小&#xff0c;确定分类依据。 信息量&#xff1a; 信息熵&#xff1a; 信息增益&#xff1a;

Beats:使用 Filebeat 从 Python 应用程序中提取日志

本指南演示了如何从 Python 应用程序中提取日志并将其安全地传送到 Elasticsearch Service 部署中。你将设置 Filebeat 来监控具有标准 Elastic Common Schema (ECS) 格式字段的 JSON 结构日志文件&#xff0c;然后你将在 Kibana 中查看日志事件发生的实时可视化。虽然此示例使…

Nginx:location配置模块的用法

运维系列 Nginx&#xff1a;location配置模块的用法 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.c…

最新整理的机器人相关数据合集(1993-2022年不等 具体看数据类型)

机器人安装数据是指记录全球或特定区域内工业机器人新安装数量的信息&#xff0c;这一数据由国际机器人联合会(IFR)等权威机构定期发布。这些数据不仅揭示了机器人技术的市场需求趋势&#xff0c;还反映了各国和地区自动化水平及产业升级的步伐。例如&#xff0c;数据显示中国在…

550kg级大载重长航时无人机直升机技术详解

550kg级大载重长航时无人机直升机&#xff0c;作为一种高性能的无人机系统&#xff0c;具备了多项先进的技术特点&#xff0c;以满足高海拔、高寒等复杂环境下的应用需求。这些无人机直升机通常具备高载重、长航时、强适应性、高可靠性和良好的任务拓展性。 设备由无人直升机平…

Android sdk 安装已经环境配置

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Android ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 正文 一、下载 二、安装 三、环境配置 我的其他博客 正文 一、下载 1、大家可去官网下载 因为需要魔法 所以就不展示了 2、去下面这…

stm32精密控制步进电机(基础篇)

众所周知&#xff0c;步进电机由于使用脉冲控制&#xff0c;会比直流电机的控制稍难一些&#xff0c;但开环控制时也更加稳定。 落到做项目的时候&#xff0c;目前来说我都会先考虑步进电机&#xff0c;再去考虑直流&#xff0c;无刷这样的电机。包括毕设时所用的机械臂也是用…

整洁架构SOLID-单一职责原则(SRP)

文章目录 定义案例分析重复的假象代码合并解决方案 小结 定义 SRP是SOLID五大设计原则中最容易被误解的一个。也许是名字的原因&#xff0c;很多程序员根据SRP这个名字想当然地认为这个原则就是指&#xff1a;每个模块都应该只做一件事。 在历史上&#xff0c;我们曾经这样描…

四大常见的排序算法JAVA

1. 冒泡排序 相邻的元素两两比较&#xff0c;大的放右边&#xff0c;小的放左边 第一轮比较完毕之后&#xff0c;最大值就已经确定&#xff0c;第二轮可以少循环一次&#xff0c;后面以此类推 如果数组中有n个数据&#xff0c;总共我们只要执行n-1轮的代码就可以 package Bu…

基于CentOS Stream 9平台搭建MinIO以及开机自启

1. 官网 https://min.io/download?licenseagpl&platformlinux 1.1 下载二进制包 指定目录下载 cd /opt/coisini/ wget https://dl.min.io/server/minio/release/linux-amd64/minio1.2 文件赋权 chmod x /opt/coisini/minio1.3 创建Minio存储数据目录&#xff1a; mkdi…

Ubuntu + SSH密钥连接服务器

1. 下载VS code cd到下载文件夹后&#xff0c;使用命令安装&#xff0c;把xxx复制为文件名 sudo dpkg -i xxx.deb2. 为VSCode换皮肤 3. 下载SSH插件和Docker插件 4. 配置SSH 把密钥key文件放在/home/your_user_name/.ssh/里面&#xff0c;然后在/home/your_user_name/.ssh/c…

昇思25天学习打卡营第7天|深度学习流程全解析:从模型训练到评估

目录 构建数据集 定义神经网络模型 定义超参、损失函数和优化器 超参 损失函数 优化器 训练与评估 构建数据集 首先从数据集 Dataset加载代码&#xff0c;构建数据集。 代码如下&#xff1a; #引入了必要的库和模块&#xff0c;像 mindspore 以及相关的数据处理模块等等。…

使用WinSCP工具连接Windows电脑与Ubuntu虚拟机实现文件共享传输

一。环境配置 1.首先你的Windows电脑上安装了VMware虚拟机&#xff0c;虚拟机装有Ubuntu系统&#xff1b; 2.在你的windows电脑安装了WinSCP工具&#xff1b; 3.打开WinSCP工具默认是这样 二。设置WinSCP连接 打开WinSCP&#xff0c;点击新标签页&#xff0c;进入到如下图的…

【持续集成_03课_Jenkins生成Allure报告及Sonar静态扫描】

1、 一、构建之后的配置 1、安装allure插件 安装好之后&#xff0c;可以在这里搜到已经安装的 2、配置allure的allure-commandline 正常配置&#xff0c;是要么在工具里配置&#xff0c;要么在系统里配置 allure-commandline是在工具里进行配置 两种方式进行配置 1&#xff…

关闭vue3中脑瘫的ESLine

在创建vue3的时候脑子一抽选了ESLine,然后这傻卵子ESLine老是给我报错 博主用的idea开发前端 ,纯粹是用不惯vscode 关闭idea中的ESLine,这个只是取消红色波浪线, 界面中的显示 第二步,在vue.config.js中添加 lintOnSave: false 到这里就ok了,其他的我试过了一点用没有

STM32-ADC+DMA

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. ADC模拟-数字转换器1.1 ADC模拟-数字转换器1.2 逐次逼近型ADC1.3 ADC框图1.4 ADC基本结构1.5 输入通道1.6 规则组的转换模式1.6.1 单次转换&#xff0c;非扫描模式1.6.2 连续转换&#xff0c;非扫描模式1.6.3 单次…

Python28-7.4 独立成分分析ICA分离混合音频

独立成分分析&#xff08;Independent Component Analysis&#xff0c;ICA&#xff09;是一种统计与计算技术&#xff0c;主要用于信号分离&#xff0c;即从多种混合信号中提取出独立的信号源。ICA在处理盲源分离&#xff08;Blind Source Separation&#xff0c;BSS&#xff0…

Spring源码十七:Bean实例化入口探索

上一篇Spring源码十六&#xff1a;Bean名称转化我们讨论doGetBean的第一个方法transformedBeanName方法&#xff0c;了解Spring是如何处理特殊的beanName&#xff08;带&符号前缀&#xff09;与Spring的别名机制。今天我们继续往方法下面看&#xff1a; doGetBean 这个方法…

按键控制LED流水灯模式定时器时钟

目录 1.定时器 2. STC89C52定时器资源 3.定时器框图 4. 定时器工作模式 5.中断系统 1&#xff09;介绍 2&#xff09;流程图&#xff1a;​编辑 3&#xff09;STC89C52中断资源 4&#xff09;定时器和中断系统 5&#xff09;定时器的相关寄存器 6.按键控制LED流水灯模…