RabbitMQ快速入门

目录

MQ简介

1、同步通信

图片

2、异步通信

图片

RabbitMQ快速上手

基本介绍:

Producer和Consumer

Connection和Channel

Virtual host

Queue

Exchange

工作流程

 AMQP

Java编写RabbitMQ生产者消费者

生产者

1.建立连接

 2.开启信道

3.声明交换机

4.声明队列

5.发送消息

6.资源释放

生产者全部代码:

消费者

执行结果


MQ简介

MQ(Message Queue)消息队列,本质上是队列,满足队列FIFO(先入先出)的性质,队列中存放的内容是消息,消息可以是只包含文本字符串,JSON,也可以是对象等。

MQ经常用于分布式系统之间的通信,系统之间的通信通常有两种方式:

1、同步通信

直接调用对方的服务,数据从一端出发到达另一端。

图片

2、异步通信

数据从⼀端发出后,先进⼊⼀个容器进⾏临时存储,当达到某种条件后,再由这个容器发送给另⼀端,这个容器通常就是MQ(message queue)。

图片

RabbitMQ快速上手

基本介绍:

RabbitMQ是MQ的一种实现,工作流程如下:

 RabbitMQ是一个消息中间件,也是一个生产者消费者模型,负责接收,存储并转发消息,消息传递的过程类似于发快递,你把快递放到驿站,快递小哥帮你把快递送到接收人的手上。这个过程中,你就相当于Producer,接收人相当于Consumer,快递站就是RabbitMQ。

Producer和Consumer

Producer(生产者),是RabbitMQ的客户端,用于发送消息到RabbitMQ。

Consumer(消费者),也是RabbitMQ的客户端,用于向RabbitMQ接收消息。

Broker(代理),RabbitMQ服务器节点,用于接收和发送消息。

生产者发送消息到RabbitMQ服务器,让RabbitMQ进行路由转发到对应的消费者。

生产者发送的消息带有标签,代理(RabbitMQ服务器)会根据标签路由,找到需要的消费者,进行消息转发。消费者接收消息进行消费过程中标签就会被丢掉,也就是说消费者并不会知道消息的发送者是谁。

Connection和Channel

 Connection(连接):客户端和RabbitMQ服务器之间的⼀个TCP连接,建立连接后才可以进行消息的发送和接收。

Channel(信道):类似于发送消息的一个通道,每个TCP连接可以有多个信道,每个信道都是独立的虚拟连接,消息的发送和接收都是基于Channel(信道)的。

Virtual host

Virtual host:虚拟主机,给消息队列提供逻辑上的隔离,一个BrokerServer可以有多个虚拟主机,当不同用户使用RabbitMQ Server提供的服务时,可以使用划分多个虚拟主机的方式将一系列业务隔离开来,类似于MySQL中不同的数据库。

Queue

Queue:队列,用于存放消息,一个队列可以被多个消费者订阅。

Exchange

Exchenge:交换机,交换机负责接收生产者发送的消息,并按照规则将消息路由到队列上。类似于快递小哥将快递送给

工作流程

Proucer生产消息 -> Producer连接到RabbitMQBroker,建立连接(Connection),开启信道(Channel) -> Producer声明交换机(Exchange),路由消息 ->Producer声明队列(Queue) -> Produce发送消息到RabbitMQBroker-> RabbitMQBroker接收消息,并放入相应的队列(Queue)中,未找到相应队列根据生产者的配置,选择丢弃或者退回给生产者。

 AMQP

AMQP是一种高级消息队列协议,定义了一套确定的消息交换功能,包括交换机,队列等,这些组件共同工作,使生产者能够将消息发送到交换机,由队列接收并等待消费者接收。AMQP还定义了一个网络协议,允许客户端应用通过这个协议与消息代理和AMQP模型进行交互通信。RabbitMQ使AMQP协议的Erlang实现。

Java编写RabbitMQ生产者消费者

打开管理页面,添加用户:

这里添加的测试用户名称为:test   密码 123456。 

创建虚拟机:

这里添加的虚拟机名称为:test

返回admin页面,点击刚刚创建的test用户,添加虚拟机操作权限。

进入IDEA创建一个Maven项目,导入依赖:

<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.20.0</version>
</dependency>

生产者

1.建立连接

使用依赖中的ConnectionFactory类创建连接,设置关键信息:

ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("139.9.116.124");
connectionFactory.setPort(5672);
connectionFactory.setUsername("fwx");
connectionFactory.setPassword("123456");
connectionFactory.setVirtualHost("测试");
Connection connection = connectionFactory.newConnection();
 2.开启信道
Channel channel = connection.createChannel();
3.声明交换机

这里使用的是RabbitMQ默认提供的交换机,不需要代码进行声明

4.声明队列

使用channel的queueDeclare方法,依此填入相关参数:

channel.queueDeclare("hello",true,false,false,null);

 打开源码,查看参数的含义:

 第一个参数queue代表队列的名称,第二个参数durable代表是否持久化(true-设置队列为持久化, 待久化的队列会存盘,服务器重启之后, 消息不丢失),第三个参数exclusive代表是否独占(是否独占, 只能有⼀个消费者监听队列),第四个参数autoDelete代表是否自动删除(没有消费者自动删除队列),第五个参数arguments代表一些配置的参数。

5.发送消息

使用Channel的basicPublish()方法进行消息的发送,这里发送的消息为"hello RabbitMQ~",消息发送10次:

for (int i = 0; i < 10; i++) {String msg = "hello RabbitMQ~";channel.basicPublish("","test1",null,msg.getBytes());
}

打开方法,分析方法参数:

  第一个参数exchange代表交换机的名称(这里使用默认交换机""),第二个参数routingKey代表路由的名称(使用默认交换机,路由名称要和队列名称相同才可以找到对应队列),第三个参数body代表发送的消息体(将String类型转换为字节数组)。

6.资源释放
channel.close();
connection.close();

最后将资源关闭即可。

生产者全部代码:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Producer {public static void main(String[] args) throws IOException, TimeoutException {//1.建立链接ConnectionFactory connectionFactory = new ConnectionFactory();//主机地址connectionFactory.setHost("139.9.116.124");//端口号connectionFactory.setPort(5672);//用户名connectionFactory.setUsername("test");//密码connectionFactory.setPassword("123456");//虚拟机connectionFactory.setVirtualHost("test");//连接建立Connection connection = connectionFactory.newConnection();//2.开启信道Channel channel = connection.createChannel();//3.声明交换机,使用内置交换机//4.声明队列channel.queueDeclare("test1",true,false,false,null);//5.发送消息for (int i = 0; i < 10; i++) {String msg = "hello RabbitMQ~";channel.basicPublish("","test1",null,msg.getBytes());}//6.资源释放channel.close();connection.close();}
}

消费者

消费者与生产者逻辑相似,这里不再讲解,全部代码:

import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Consumer {public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {//1.建立链接ConnectionFactory connectionFactory = new ConnectionFactory();//主机地址connectionFactory.setHost("139.9.116.124");//端口号connectionFactory.setPort(5672);//用户名connectionFactory.setUsername("test");//密码connectionFactory.setPassword("123456");//虚拟机connectionFactory.setVirtualHost("test");//连接建立Connection connection = connectionFactory.newConnection();//2.开启信道Channel channel = connection.createChannel();//3.声明队列(生产者已经声明)//4.消费消息/**参数声明* basicConsume(String queue, boolean autoAck, Consumer callback)* queue:队列名* autoAck:自动确认* callback:接收到消息执行逻辑*/DefaultConsumer consumer = new DefaultConsumer(channel){//从队列中收到消息,就会执行的方法@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {//TODOSystem.out.println("接收的消息:"+new String(body));}};channel.basicConsume("test1",true,consumer);//等待程序执行完成Thread.sleep(2000);//5.释放资源channel.close();connection.close();}
}

生产者已经声明过队列,消费者无需声明,消费者通过重写handleDelivery()方法(这个方法在接收消息时自动执行)去消费消息。

执行结果

执行生产者代码,打开RabbitMQ管理页面,看到队列test1产生了10条消息等待消费:

执行消费者,此时控制台打印了接收的消息:

再查看管理页面,消息已经全部消费:

 到此结束,感谢观看!

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

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

相关文章

【Qt】编程基础

目录 一、Qt体系框架&#xff1a; ​编辑二、布局方式&#xff1a; 1.绝对布局 setGeometry()函数 2.盒子布局&#xff1a; QHBoxLayout:水平布局管理器 QVBoxLayout:垂直布局管理器 QGridLayout:网格布局管理器 三、基本控件及其函数 标签类 &#xff1a;QLabel 按…

温湿度监控设备融入智慧物联网

当医院的温湿度监控设备融入智慧物联网&#xff0c;将会带来许多新的体验&#xff0c;可以帮助医院温湿度监控设备智能化管理&#xff0c;实现设备之间的互联互通&#xff0c;方便医院对温湿度数据进行统一管理和分析。 添加智慧物联网技术&#xff0c;实现对医院温湿度的实时…

登录次数限制

文章目录 一、应用场景与设计目的1. 应用场景2. 设计目的 二、功能设计1. 登录限制规则2. 解锁机制3. 适用维度 三、技术实现1. 数据存储2. 逻辑流程3. 实现代码示例4. 动态锁定时间 四、安全增强与扩展1. 防止用户名枚举2. 加入验证码3. 监控与报警4. 分布式支持 五、设计思考…

人工智能销售客服app开发,OpenAI宣布GPT-5免费使用?Deepseek让AI巨头全跪了

人工智能技术的飞速发展&#xff0c;正在深刻改变着各行各业&#xff0c;销售客服领域也不例外。随着 GPT-5 等大型语言模型的不断进化&#xff0c;AI 销售客服系统也迎来了前所未有的变革&#xff0c;开启了智能客服的新时代。 传统客服痛点亟待解决&#xff1a; 传统的销售…

vscode集成DeepSeek

vscode 扩展 安装 Cline Meet Cline&#xff0c;一个可以使用你的CLI和编辑器的AI助手。 得益于 Claude 3.5 Sonnet的代理编码功能&#xff0c;Cline 可以逐步处理复杂的软件开发任务。借助让他创建和编辑文件、探索大型项目、使用浏览器和执行终端命令(在您授予权限后)的工具&…

2.27-1笔记1

一、新建表 二、建表语句 create table student( id int primary key , name char(20), sex char(10), age int(3), mobile char(20), class char(10), english int(10), chinese int(10), math int(10) )engineinnodb default charsetutf8; insert into student values (1,小…

30.[前端开发-JavaScript基础]Day07-数组Array-高阶函数-日期Date-DOM

JavaScript的DOM操作 &#xff08;一&#xff09; 1 什么是DOM&#xff1f; 认识DOM和BOM 深入理解DOM 2 认识DOM Tree DOM Tree的理解 3 DOM的整体结构 DOM的学习顺序 DOM的继承关系图 document对象 4 节点、元素导航 节点&#xff08;Node&#xff09;之间的导航&…

【Viewer.js】vue3封装图片查看器

效果图 需求 点击图片放大可关闭放大的 图片 下载 cnpm in viewerjs状态管理方法 stores/imgSeeStore.js import { defineStore } from pinia export const imgSeeStore defineStore(imgSeeStore, {state: () > ({showImgSee: false,ImgUrl: ,}),getters: {},actions: {…

Haption:机器人遥操作触觉力反馈技术革新解决方案

在机器人遥操作过程中&#xff0c;实时、准确地感知机器人所抓握物体的大小与力度&#xff0c;是机器人能否胜任复杂精密任务的关键所在。触觉力反馈技术的融入&#xff0c;正为遥操作技术带来前所未有的变革&#xff0c;推动其迈向新的发展阶段。作为力反馈技术的佼佼者&#…

⭐算法OJ⭐矩阵的相关操作【动态规划 + 组合数学】(C++ 实现)Unique Paths 系列

文章目录 62. Unique Paths动态规划思路实现代码复杂度分析 组合数学思路实现代码复杂度分析 63. Unique Paths II动态规划定义状态状态转移方程初始化复杂度分析 优化空间复杂度状态转移方程 62. Unique Paths There is a robot on an m x n grid. The robot is initially lo…

简单介绍JVM

1.什么是JVM&#xff1f; JVM就是Java虚拟机【Java Virtual Machine】&#xff0c;简称JVM。主要部分包括类加载子系统&#xff0c;运行时数据区&#xff0c;执行引擎&#xff0c;本地方法库等&#xff0c;接下来我们一一介绍 2.类加载子系统 JVM中运行的就是我们日常写的JA…

【HarmonyOS Next】鸿蒙状态管理装饰器V1和V2混用方案

【HarmonyOS Next】鸿蒙状态管理装饰器V1和V2混用方案 一、V1和V2为什么需要混用 自从api7开始&#xff0c;一直到api10。V1的实际使用中&#xff0c;开发人员发现Observed和ObjectLink 监听实现多层级嵌套对象的更新的方案&#xff0c;太过于臃肿。当需要监听处理更新的多层…

IP段转CIDR:原理Java实现

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

考研出分24小时,人类精神状态图鉴

2月24日&#xff0c;上午10点起&#xff0c;各省考研初试成绩陆续公布&#xff0c;考生们或紧张的输入准考证号&#xff0c;或抱团等待“审判”。然而更魔幻的还在后头——下午4点&#xff0c;教育部竟在同一天直接发布了《2025年研考国家分数线》。 不少网友表示&#xff1a;…

卷积神经网络梯度下降方向与参数更新方向的一致性论述

梯度下降是一种常用的优化算法&#xff0c;用于最小化损失函数&#xff0c;在机器学习和深度学习领域有着广泛的应用。分别对梯度下降、梯度方向以及参数更新采用负梯度方向的原因进行论述。 1.梯度下降 它的基本思想是通过迭代的方式来更新模型的参数&#xff0c;使得损失函数…

使用 Spring Boot 和 Keycloak 的 OAuth2 快速指南

1. 概述 本教程是关于使用 Spring Boot 和 Keycloak 通过 OAuth2 配置后端的。 我们将使用 Keycloak 作为 OpenID 提供程序。我们可以将其视为负责身份验证和用户数据&#xff08;角色、配置文件、联系信息等&#xff09;的用户服务。它是最完整的 OpenID Connect &#xff0…

GCN从理论到实践——基于PyTorch的图卷积网络层实现

Hi&#xff0c;大家好&#xff0c;我是半亩花海。图卷积网络&#xff08;Graph Convolutional Network, GCN&#xff09;是一种处理图结构数据的深度学习模型。它通过聚合邻居节点的信息来更新每个节点的特征表示&#xff0c;广泛应用于社交网络分析、推荐系统和生物信息学等领…

mapbox基础,使用geojson加载heatmap热力图层

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️heatmap热力图层样式二、🍀使用geojs…

AI数字人开发,引领科技新潮流

引言 随着人工智能技术的迅猛发展&#xff0c;AI 数字人在影视娱乐、客户服务、教育及医疗等多个领域展现出巨大的潜力。本文旨在为开发者提供一份详细的 AI 数字人系统开发指南&#xff0c;涵盖从基础架构到实现细节的各个方面&#xff0c;包括人物建模、动作生成、语音交互、…

python量化交易——金融数据管理最佳实践——qteasy创建本地数据源

文章目录 qteasy金融历史数据管理总体介绍本地数据源——DataSource对象默认数据源查看数据表查看数据源的整体信息最重要的数据表其他的数据表 从数据表中获取数据向数据表中添加数据删除数据表 —— 请尽量小心&#xff0c;删除后无法恢复&#xff01;&#xff01;总结 qteas…