RabbitMQ (Java)学习笔记
目录
一、概述
①核心组件
②工作原理
③优势
④应用场景
二、入门
1、docker 安装 MQ
2、Spring AMQP
3、代码实现
pom 依赖
配置RabbitMQ服务端信息
发送消息
接收消息
三、基础
work Queue
案例
消费者消息推送限制(解决消息堆积方案之一)
Work模型的使用
Fanout交换机
Fanout 广播模式
案例
Fanout Exchange交换机的作用是什么?
Direct 交换机
一、概述
RabbitMQ是一种开源的消息代理软件,基于AMQP(高级消息队列协议)实现。它充当消息中间件的角色,允许应用程序通过消息队列进行异步通信。RabbitMQ的主要功能是接收、存储和转发消息,从而解耦应用程序组件,提高系统的可扩展性和可靠性。
①核心组件
-
生产者(Producer):负责创建消息并将其发送到RabbitMQ服务器。生产者可以是任何应用程序,它们将消息封装成特定的格式,然后通过网络发送到消息代理。
-
交换器(Exchange):交换器是消息传递的枢纽,它接收生产者发送的消息,并根据一定的规则将消息路由到一个或多个队列中。RabbitMQ提供了多种类型的交换器,如直接交换器(direct)、扇形交换器(fanout)、主题交换器(topic)等,每种交换器的路由规则不同。
-
直接交换器:根据消息的路由键(routing key)直接将消息发送到与该路由键绑定的队列。
-
扇形交换器:将消息广播到所有绑定的队列,不考虑路由键。
-
主题交换器:根据路由键的模式匹配规则将消息发送到匹配的队列。
-
-
队列(Queue):队列是存储消息的容器,它是一个先进先出(FIFO)的数据结构。队列中的消息会被消费者(Consumer)依次消费。队列可以持久化,即使RabbitMQ服务器重启,队列中的消息也不会丢失。
-
消费者(Consumer):消费者从队列中获取消息并进行处理。消费者可以是应用程序的另一个组件,也可以是独立的进程。消费者通过订阅队列来接收消息,一旦队列中有消息到达,消费者就会按照一定的策略(如轮询、负载均衡等)进行消费。
②工作原理
-
消息发送过程
-
生产者创建消息,并指定交换器和路由键。
-
生产者将消息发送到RabbitMQ服务器。
-
交换器根据路由键将消息路由到一个或多个队列。
-
如果队列不存在,交换器会根据配置决定是否丢弃消息或返回错误。
-
-
消息接收过程
-
消费者向RabbitMQ服务器发送订阅请求,指定要消费的队列。
-
当队列中有消息到达时,RabbitMQ服务器将消息推送给消费者。
-
消费者接收到消息后进行处理,处理完成后向服务器发送确认消息(ack),告知服务器该消息已被成功消费。如果消费者在处理消息过程中失败或崩溃,RabbitMQ服务器会将消息重新放入队列,等待其他消费者消费。
-
③优势
-
高可靠性:RabbitMQ支持消息持久化,即使服务器出现故障,消息也不会丢失。同时,它还支持镜像队列,可以在多个节点之间复制队列,提高系统的可用性。
-
高可用性:RabbitMQ可以部署在多个节点上,形成集群。集群中的节点可以相互备份,当某个节点出现故障时,其他节点可以接管其工作,保证系统的正常运行。
-
灵活的路由策略:通过不同类型的交换器和路由键,可以实现复杂的消息路由逻辑,满足各种业务场景的需求。
-
易于扩展:RabbitMQ支持水平扩展,可以通过增加节点来提高系统的处理能力。同时,它还支持多种编程语言的客户端库,方便开发者进行集成。
④应用场景
-
异步任务处理:当应用程序需要执行耗时的任务时,可以将任务封装成消息发送到RabbitMQ,然后由消费者在后台进行处理,从而提高系统的响应速度。
-
服务间通信:在微服务架构中,不同的服务可以通过RabbitMQ进行通信,实现服务的解耦和异步交互。
-
事件驱动架构:RabbitMQ可以作为事件总线,将事件消息传递给不同的消费者,实现事件驱动的业务逻辑。
-
日志收集:将日志消息发送到RabbitMQ,然后由专门的日志处理程序进行消费和分析,实现日志的集中管理和分析。
二、入门
MQ技术选型参考图如下:
1、docker 安装 MQ
docker run \-e RABBITMQ_DEFAULT_USER=itheima \ # MQ 默认登录用户-e RABBITMQ_DEFAULT_PASS=123321 \ # MQ 默认登录用户的密码-v mq-plugins:/plugins \ # 默认挂载--name mq \ # 容器名--hostname mq \ # 主机名-p 15672:15672 \ # MQ 访问图像化页面端口-p 5672:5672 \ # MQ 通信端口-d \ rabbitmq:3.8-management
2、Spring AMQP
SpringAmqp的官方地址 :SpringAMQP官方网址
3、代码实现
pom 依赖
<!--AMQP依赖,包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>
配置RabbitMQ服务端信息
在每个微服务中引入MQ服务端信息,这样微服务才能连接到RabbitMQ
spring:rabbitmq:host: localhost # 主机名port: 5672 # 端口virtual-host: /hmall # 虚拟主机username: hmall # 用户名password: 123 # 密码
发送消息
SpringAMQP提供了RabbitTemplate工具类,方便我们发送消息。样例发送消息代码如下
@SpringBootTest
public class SpringAmqpTest {@Autowiredprivate RabbitTemplate rabbitTemplate;@Testvoid testSendMessage2Queue() {// 队列名称String queueName = "simple.queue";
// 消息String message = "Hello,Spring amqp !";
// 发送消息rabbitTemplate.convertAndSend(queueName, message);}
}
接收消息
SpringAMQP提供声明式的消息监听,我们只需要通过注解在方法上声明要监听的队列名称,将来SpringAMQP就会把消息传递给当前方法:
@Slf4j
@Component
public class mqListener {@RabbitListener(queues = "simple.queue")public void listenSimpleQueue(String msg){ // 注意这里接受的参数类型,取决于队列中发送者发送的消息类型,因为我们发送者发送字符串,所以这里接受的参数类型也是字符串log.info("消费者收到了Simple.queue的消息:【{}】",msg);}
}
三、基础
work Queue
Workqueues,任务模型。简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息
案例
模拟WorkQueue,实现一个队列绑定多个消费者
基本思路如下:
- 在RabbitMQ的控制台创建一个队列,名为work.queue
- 在publisher服务中定义测试方法,在1秒内产生50条消息,发送到work.queue
- 在consumer服务中定义两个消息监听者,都监听work.queue队列
- 消费者1每秒处理50条消息,消费者2每秒处理5条消息
通过Thread.sleep 方式 模拟性能不同的时候接受到的数据
@RabbitListener(queues = "work.queue")public void listenWorkQueue1(String msg) throws InterruptedException { // 注意这里接受的参数类型,取决于队列中发送者发送的消息类型,因为我们发送者发送字符串,所以这里接受的参数类型也是字符串System.out.println("消费者1 收到了 work.queue 的消息:【" + msg + "】");Thread.sleep(20);}@RabbitListener(queues = "work.queue")public void listenWorkQueue2(String msg) throws InterruptedException { // 注意这里接受的参数类型,取决于队列中发送者发送的消息类型,因为我们发送者发送字符串,所以这里接受的参数类型也是字符串System.err.println("消费者2 收到了 work.queue 的消息........:【" + msg + "】");Thread.sleep(200);}
最后发现,消费者接受到的消息是默认的一人一半效果,而处理消息方面可以显示出效率比较低下
消费者消息推送限制(解决消息堆积方案之一)
默认情况下,RabbitMQ的会将消息依次轮询投递给绑定在队列上的每一个消费者。但这并没有考虑到消费者是否已经处理完消息,可能出现消息堆积。
因此我们需要修改application.yml,设置preFetch值为1,确保同一时刻最多投递给消费者1条消息:
spring:rabbitmq:listener:simple:prefetch: 1 # 每次只能获取一条消息,处理完成才能获取下一个消息
我们重新发送消息可以发现
这样我们可以充分消费每一条消息,能者多劳效果。
Work模型的使用
- 多个消费者绑定到一个队列,可以加快消息处理速度
- 同一条消息只会被一个消费者处理
- 通过设置prefetch来控制消费者预取的消息数量,处理完一条再处理下一条,实现能者多劳
Fanout交换机
真正生产环境都会经过exchange来发送消息,而不是直接发送到队列,交换机的类型有以下三种:
- Fanout : 广播
- Direct : 定向
- Topic : 话题
Fanout 广播模式
Fanout Exchange 会将接收到的消息广播到每一个跟其绑定的queue,所以也叫广播模式
通过 exchange 广播消息给队列,多个消费者 处理绑定的一个队列中的不同订单消息,并行操作,提高效率。
案例
利用SpringAMQP演示FanoutExchange的使用
实现思路如下:
- 在RabbitMQ控制台中,声明队列fanout.queue1和fanout.queue2
- 在RabbitMO控制台中,声明交换机hmall.fanout,将两个队列与其绑定
- 在consumer服务中,编写两个消费者方法,分别监听fanout.queue1和fanout.queue2
- 在publisher中编写测试方法,向hmall.fanout发送消息.
消费者方法
@RabbitListener(queues = "fanout.queue1")public void listenFanoutQueue1(String msg){ // 注意这里接受的参数类型,取决于队列中发送者发送的消息类型,因为我们发送者发送字符串,所以这里接受的参数类型也是字符串System.out.println("消费者1 收到了 fanout.queue1 的消息:【{"+ msg + "}】");}@RabbitListener(queues = "fanout.queue2")public void listenFanoutQueue2(String msg){ // 注意这里接受的参数类型,取决于队列中发送者发送的消息类型,因为我们发送者发送字符串,所以这里接受的参数类型也是字符串System.err.println("消费者2 收到了 fanout.queue2 的消息:【{" + msg + "}】");}
发送消息方法
@Testvoid testSendFanout() {// 队列名称String exchangeName = "hmall.fanout";
// 消息String message = "Hello,everyone!!!";
// 发送消息rabbitTemplate.convertAndSend(exchangeName, "", message);
// rabbitTemplate.convertAndSend(exchangeName, null, message); // 或者 第二个参数为 null}
Fanout Exchange交换机的作用是什么?
- 接收publisher发送的消息
- 将消息按照规则路由到与之绑定的队列
- Fanout Exchange的会将消息路由到每个绑定的队列
Direct 交换机
Direct Exchange 会将接收到的消息根据规则路由到指定的Queue,因此称为定向路由。
- 每一个Queue都与Exchange设置一个BindingKey
- 发布者发送消息时,指定消息的RoutingKey
- Exchange将消息路由到BindingKey与消息RoutingKey一致的队列
---------------------------------------------- 持续更新中----------------------------------------------------------
相关文章:
RabbitMQ (Java)学习笔记
目录 一、概述 ①核心组件 ②工作原理 ③优势 ④应用场景 二、入门 1、docker 安装 MQ 2、Spring AMQP 3、代码实现 pom 依赖 配置RabbitMQ服务端信息 发送消息 接收消息 三、基础 work Queue 案例 消费者消息推送限制(解决消息堆积方案之一&#…...
2-002:MySQL 索引的最左前缀匹配原则是什么?
MySQL 索引的最左前缀匹配原则 最左前缀匹配原则(Leftmost Prefix Matching) 是指: 当 查询使用了复合索引(联合索引) 时,MySQL 会优先匹配索引的 最左列,然后逐步向右匹配,直到遇到…...
【Python 数据结构 15.哈希表】
目录 一、哈希表的基本概念 1.哈希表的概念 2.键值对的概念 3.哈希函数的概念 4.哈希冲突的概念 5.常用的哈希函数 Ⅰ、直接定址法 Ⅱ、平方取中法 Ⅲ、折叠法 Ⅳ、除留余数法 Ⅴ、位与法 6.哈希冲突的解决方案 Ⅰ、开放定址法 Ⅱ、链地址法 7.哈希表的初始化 8.哈希表的元素插…...
校园安全用电怎么保障?防触电装置来帮您
引言 随着教育设施的不断升级和校园用电需求的日益增长,校园电力系统的安全性和可靠性成为了学校管理的重要课题。三相智能安全配电装置作为一种电力管理设备,其在校园中的应用不仅能够提高电力系统的安全性,还能有效保障师生的用电安全&am…...
疗养院管理系统设计与实现(代码+数据库+LW)
摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装疗养院管理系统软件来发挥其高效地信息处理的作用…...
基于 Redis Stream 实现消息队列功能
好长时间没更新了。。。。。。 背景:举个例子在某个接口执行完成后只需要前半段返回结果,后半段可能是日志记录、下游系统调用等功能的情况下,将耗时的消息进行异步发送就显得很有必要,这时就有很多种选择,单体项目甚至…...
单元测试、系统测试、集成测试、回归测试的步骤、优点、缺点、注意点梳理说明
单元测试、系统测试、集成测试、回归测试的梳理说明 单元测试 步骤: 编写测试用例,覆盖代码的各个分支和边界条件。使用测试框架(如JUnit、NUnit)执行测试。检查测试结果,确保代码按预期运行。修复发现的缺陷并重新测…...
深入理解 HTML 中的<div>和元素:构建网页结构与样式的基石
一、引言 在 HTML 的世界里,<div>和元素虽看似普通,却扮演着极为关键的角色。它们就像网页搭建过程中的万能积木,能够将各种 HTML 元素巧妙地组合起来,无论是构建页面布局,还是对局部内容进行样式调整ÿ…...
网络安全信息收集[web子目录]:dirsearch子目录爆破全攻略以及爆破字典结合
目录 一、dirsearch 工具详细使用攻略 1. 安装 前提条件 安装步骤 可选:直接下载预编译版本 2. 基本用法 命令格式 参数说明 示例 3. 核心功能与高级用法 3.1 多线程加速 3.2 自定义字典 3.3 递归扫描 3.4 过滤响应 3.5 添加请求头 3.6 代理支持 3…...
Mybaties批量操作
1、批量插入 <!--批量操作-插入--><!-- 相当于INSERT INTO t_goods (c1,c2,c3) VALUES (a1,a2,a3),(b1,b2,b3),(d1,d2,d3),...--><insert id"batchInsert" parameterType"java.util.List">INSERT INTO t_goods (title,sub_title,origina…...
27.卷2的答案
CSP-J离我们不远了,加加油啦! 1.堆排序最坏时间复杂度是? 解析:平时多多练习可知,最坏时间复杂度是O(n log n)。 2.哪条能将s中的数值保留一位,并将第二位四舍五入? 解析:经过试…...
【 Manus平替开源项目】
文章目录 Manus平替开源项目1 OpenManus1.1 简介1.2 安装教程1.3 运行 2 OWL2.1 简介2.2 安装教程2.3 运行 3 OpenHands(原OpenDevin)3.1 简介3.2 安装教程和运行 Manus平替开源项目 1 OpenManus 1.1 简介 开发团队: MetaGPT 核心贡献者(5…...
【WEB APIs】DOM-事件基础
目录 1. 事件监听(绑定) 案例—关闭广告 案例-随机点名 2. 事件类型 2.1 鼠标事件 2.2 焦点事件 2.3 文本事件 3. 事件对象 案例—评论回车发布 4. 环境对象 5. 回调函数 6. 综合案例—tab栏切换 1. 事件监听(绑定) …...
66.Harmonyos NEXT 图片预览组件使用指南
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! Harmonyos NEXT 图片预览组件使用指南 文章目录 Harmonyos NEXT 图片预览组件使用指南效果预览一、组件使用概述1. 组件功能特点2. 组件依赖关系 二…...
linux系统安装和激活conda
安装 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.shbash ./Miniconda3-latest-Linux-x86_64.sh回车到最后按照输入yes,之后按提示操作。 激活 conda activate如果没有反应或者返回: bash: conda: command not found则…...
Java 集合框架大师课:集合框架的暗黑料理(六)
🔮Java 集合框架大师课:集合框架的暗黑料理(六)——弱引用与幽灵队列 第一章 弱引用:Java世界的塑料兄弟情 💔 四大引用类型生死簿 // 四类引用生死实验 Object strongObj new Object(); …...
LVI-SAM、VINS-Mono、LIO-SAM算法的阅读参考和m2dgr数据集上的复现(留作学习使用)
ROS一键安装参考: ROS的最简单安装——鱼香一键安装_鱼香ros一键安装-CSDN博客 opencv官网下载4.2.0参考:https://opencv.org/releases/page/3/ nvidia驱动安装:ubuntu18.04 安装显卡驱动 - 开始战斗 - 博客园 cuda搭配使用12 cuda安装1:Ub…...
京鲁医疗健康专家委员会聊城专家团成立
3月13日由京鲁医疗健康专家委员会指导,聊城市委人才工作领导小组办公室、聊城市卫生健康委员会、聊城市人才引进服务中心主办的"智链医脉.新启未来"聊城卫生健康产才共融发展交流会在北京人卫酒店召开。会上,京鲁医疗健康专家委员会…...
MySQL的事务机制
事务 事务概念:事务是一个完整的操作单元,不可分割,事务中的操作要么全部成功,要么全部失败。 1. 事务特性 ACID 1.1 原子性(A) 一个事务中所有操作是不能被分割的,要么所有的操作都成功&am…...
30、Vuex 为啥可以进行缓存处理
Vuex 状态管理基础与缓存的关联 Vuex 的核心概念: Vuex 主要由五个部分组成:state、mutations、actions、getters和modules。其中,state是存储数据的地方,类似于一个全局的数据仓库。在这个菜谱 APP 的例子中,缓存的数…...
OpenAI Agents SDK 中文文档 中文教程 (5)
英文文档原文详见 OpenAI Agents SDKhttps://openai.github.io/openai-agents-python/ 本文是OpenAI-agents-sdk-python使用翻译软件翻译后的中文文档/教程。分多个帖子发布,帖子的目录如下: (1) OpenAI 代理 SDK, 介绍及快速入门 (2)Open…...
如何处理PHP中的文件上传错误
如何处理PHP中的文件上传错误 在Web开发中,文件上传是一个常见的功能需求。然而,文件上传过程中可能会遇到各种错误,如文件大小超出限制、文件类型不被允许、上传过程中断等。为了确保用户能够顺利上传文件,并且开发者能够有效地…...
mac安装python没有环境变量怎么办?zsh: command not found: python
在mac电脑上,下载Python安装包进行安装之后,在终端中,输入python提示: zsh: command not found: python 一、原因分析 首先,这个问题不是因为python没有安装成功的原因,是因为python安装的时候,没有为我们添加环境变量导致的,所以我们只需要,在.zshrc配置文件中加上环…...
湿大气校正效应
目的 修正由于大气中的水汽对雷达波传播速度的影响,以提高海面高度测量的准确性,有时候也叫做对流层校正。水汽的时空变化复杂,难以直接通过气象模型准确预测。水汽的折射作用使雷达信号的传播速度减慢,从而导致测量的海面高度虚增…...
算法系列之回溯算法求解数独及所有可能解
有没有对数独感兴趣的朋友呢?数独作为一款经典的逻辑游戏,其目标是在一个9x9的方格中填入数字1至9,确保每一行、每一列以及每一个3x3的子网格中都包含这些数字且不重复。尽管数独的规则看似简单,但编写一个能够自动求解数独的程序…...
动态路径规划——01背包问题讲解和通过滚动数组优化
如果没有动态路径规划基础的兄弟可以出去了,这个题目有两个问题 第一问讲解: 1.定义状态表示 刚开始我做的时候根据我的经验定义了一个状态表示dp[i]表示从1到i个物品中选择的最大价值,但是这个状态表示有一个明显的问题,我怎么知…...
蓝队基本技能 web入侵指南 日志分析 后门查杀 流量分析
前言 为了赶工我是没学过红队的,首先我们要做的是 1、拿到用户给的web的时候 要先知道 web的源码 服务器 中间件 数据库这些信息 2、知道web日志放在哪里 会一些基本的分析 3、webshell查杀的基本技能 4、会分析基本的工具链 会写报告 .NET IIS 配置…...
docker基本应用和相关指令
文章目录 概要镜像管理容器操作网络管理数据卷管理其他常用指令典型场景示例小结 概要 Docker的命令通常分为几个大类,比如镜像管理(images)、容器管理(containers)、网络(network)、数据卷&…...
Django REST Framework中的序列化器类和视图类
序列化器类 一、Serializer序列化类 Serializer是DRF的序列化器基类,提供基本功能,使用Serializer类需要自己定义字段名称和类型。 BookSerializer(Serializer):name serializers.CharField()price serlializers.IntegerField()date serlializers.…...
模拟人生4大型MOD整合包3000+
存档介绍 (懒人萌新必备) 游戏内全面的人物美化、房屋改造、地图美化 美化人物250个(颜值在线,均搭配八套服饰) 全地图房屋改造(住宅、公寓、公用/商业地段等) 游戏内22张地图均已美化替换 存档…...
算法基础 -- Brian Kernighan 算法初识
Brian Kernighan 算法:利用 x & (x - 1) 逐步清除最低位的 1 1. 算法原理 x & (x - 1) 这个操作的作用是每次清除 x 的最低位的 1。由于 二进制的减法 会影响最低的 1,我们可以利用这一特性不断去除 1,直到 x 变为 0,从…...
基于Uniapp开发tab选项卡/标签栏前端组件
在开发一些业务场景时候,可能需要切换标签栏来展示不同的信息列表。 为此开发了一个Uniapp组件(myTab),下面为组件的展示效果: 案例代码: <template><view class"content"><myt…...
双向广搜
从两侧同时展开,那测数据少就从哪侧展,两者展开结果出现一样的,返回答案 127. 单词接龙 - 力扣(LeetCode) class Solution { public:int ladderLength(string beginWord, string endWord, vector<string>& wordList) {unordered_set<stri…...
2024下半年真题 系统架构设计师 论文写作 答案解析
系统架构设计师第二版VIP课程https://edu.csdn.net/course/detail/40283 试题一 论软件维护及其应用 请围绕“论软件维护及其应用”论题,依次从以下三个方面进行论述。 1.概要叙述你参与分析设计的软件项目以及你在其中所承担的主要工作。 2.请介绍软件维护的内…...
【VSCODE 插件 可视化】:SVG 编辑插件 SVG Editor
插件下载 svgeditor 创建文件 Windows/Linux 快捷键 Ctrl Shift P 打开VSCODE 命令面板查找 New File With Svg Editor 编辑文件 保存文件 打开文件以继续编辑 CG 选中多个:shift单击没找到横向分布功能无法用键盘微调位置...
go中实现子模块调用main包中函数的方法
你提到的“import cycle not allowed”错误是 Go 语言中一个常见的问题,表示在包的导入中存在循环依赖。在 Go 中,一个包不能直接或间接导入自己,否则就会报这个错误。 在你提到的第二个例子中,main 包和 submodule 包相互导入&a…...
VUE的脚手架搭建引入类库
VUE的小白脚手架搭建 真的好久好久自己没有发布自己博客了,对于一直在做后端开发的我 ,由于社会卷啊卷只好学习下怎么搭建前端,一起学习成长吧~哈哈哈(最终目的,能够懂并简易开发) 文章目录 VUE的小白脚手架搭建1.下载node.js2.安装vue脚手架3.创建一个项目4.代码规范约束配置(…...
java maven依赖传递以及版本冲突
文章目录 基本背景基本排查冲突工具依赖传递:很多依赖到底使用哪个版本的依赖dependencyManagement 作用exclusions其他问题 基本背景 你使用 java,使用 maven pom.xml 管理你的依赖包 可能常常遇到依赖版本冲突,或者很多依赖包,…...
【3-14 STC-pair超级详细的解说】
1. pair的定义和结构 • 基础概念:考察对std::pair模板类的理解,包括其头文件(<utility>)和基本语法(pair<T1, T2>)。 • 成员访问:测试对first和second成员变量的使用能力。 • 构…...
Python开发合并多个PDF文件
前言 在我们的工作中,可能有以下场景需要用到合并多个PDF: 文档归档:在企业或组织中,常常需要将相关的文档(如合同、报告、发票等)合并为一个PDF文件,以便于归档和管理。 报告生成:在…...
基于SpringBoot + Vue 的房屋租赁系统
基于springboot的房屋租赁管理系统-带万字文档 SpringBootVue房屋租赁管理系统 送文档 本项目有前台和后台两部分、多角色模块、不同角色权限不一样 共分三种角色:用户、管理员、房东 管理员:个人中心、房屋类型管理、房屋信息管理、预约看房管理、合…...
Qt QML实现弹球消砖块小游戏
前言 弹球消砖块游戏想必大家都玩过,很简单的小游戏,通过移动挡板反弹下落的小球,然后撞击砖块将其消除。本文使用QML来简单实现这个小游戏。 效果图: 正文 代码目录结构如下: 首先是小球部分,逻辑比较麻…...
ROS实践(四)机器人SLAM建图(gmapping)
目录 一、SLAM技术 二、常用工具和传感器 三、相关功能包 1. gmapping建图功能包 2. map_server 四、SLAM 建图实验 1. 配置gmapping(launch文件) 2. 启动机器人仿真(含机器人以及传感器) 3. 运行gmapping节点 4. 启动rviz可视化工具 5. 保存地图文件 一、SLAM技…...
使用Arduino、ESP8266和GPS在Google地图上追踪车辆
使用 ESP8266、GPS 和 Google 地图的 Arduino Vehicle Tracker 如今,车辆跟踪系统变得非常重要,尤其是在车辆被盗的情况下。如果您的车辆安装了 GPS 系统,您可以跟踪您的车辆位置,它可以帮助警方追踪被盗车辆。 在这里,我们正在构建更高级版本的车辆跟踪系统,您可以在其…...
python数据分析文件夹篇--pandas,openpyxl,xlwings三种方法批量创建、 复制、删除工作表
前言 之前我们学习了使用pandas灵活地读取数据,包括读取工作簿中一个或几个工作表,读取工作表中一行或多行,一列或多列数据,还学习了如何将数据灵活保存到本地。 今天我们学习一下文件夹中文件的批量处理操作,包括批量…...
MyBatis 的一级、二级缓存
文章目录 1️⃣ 一级缓存(Local Cache)📌 定义🚀 示例代码 2️⃣ 二级缓存(Global Cache)📌 定义🚀 使用方式 3️⃣ 一级缓存 vs. 二级缓存 📊4️⃣ 数据共享问题&#x…...
掌握市场先机:9款销售渠道管理工具深度测评
本文主要介绍了以下9款销售渠道管理工具:1.纷享销客; 2.销帮帮; 3.小满CRM; 4.有赞; 5.Oracle NetSuite; 6.Salesforce Sales Cloud; 7.Cin7; 8.Pipedrive; 9.BigCommerc…...
【计算机网络通信 MQTT和AMQP的原理及应用场景、优缺点】
MQTT(Message Queuing Telemetry Transport)和AMQP(Advanced Message Queuing Protocol)都是常用的消息中间件协议,以下是它们的原理、应用场景、优缺点介绍: 原理 MQTT 基于发布/订阅模式,有…...
如何搭建一个适配微信小程序,h5,app的uni-app项目
在vscode搭建 uni-app 项目(Vue 3 Vite Pinia uView Plus) 一、环境准备 1. 安装 Node.js 确保已安装 Node.js(需≥14版本),可通过以下命令检查版本: node -v2. 安装 VSCode 从 VSCode 官网 下载并…...
3.14学习总结 排序算法
插入排序: 1.直接插入排序 维护一个有序区,把元素一个个插入有序区的适当位置,直到所有元素都有序为止。 for (int i 0;i < n - 1;i) {//升序int end i;int temp k[end 1];while (end > 0) {if (temp < k[end]) {k[end 1] …...