【RocketMq源码篇-01】环境搭建、基本使用、可视化界面
RocketMq源码核心篇整体栏目
内容 | 链接地址 |
---|---|
【一】环境搭建、基本使用、可视化界面 | https://zhenghuisheng.blog.csdn.net/article/details/147481401 |
环境搭建、基本使用、可视化界面
- 一,RocketMq源码分析
- 1. docker安装rocketMq
- 2. rocketMq基本使用
- 2.1,创建topic主题
- 2.2,java基础代码测试
- 2.3,结合springboot使用
- 3. 安装可视化界面
如需转载,请附上链接:https://blog.csdn.net/zhenghuishengq/article/details/147481401
一,RocketMq源码分析
在现在流行的mq消息中间件中,rocketMq和kafka如今是占市面主流,其二者底层思想相互借鉴,又由于rocketMq底层源码是通过java代码实现,因此这里优先考虑研究rocketMq的底层,能把rocketMq中间件熟练掌握后,那么kafka自然也能够融汇贯通。从本系列开始正式迈入rocketMq源码篇章,在保证会用的同时,也能够知道其底层原理和内部实现,同时也能够学习内部优秀的源码设计和风格。
在rocketmq中,5.x版本是grpc协议实现,4.x版本还是基于netty协议,并且5.x内部模块相对于4.x版本重构了很多,文档等也相对较少,因此为了深度的学习rocketMq的底层源码,我们先从4.x的版本学起,这里推荐使用4.9.4版本,其源码地址如下:https://github.com/apache/rocketmq/tree/release-4.9.4
也可以直接使用我gitee仓库现成的源码,也包含一些案例和注释:https://gitee.com/zhenghuisheng/rocketmq-source-code-learning
可视化界面源码,里面的jar包也能直接使用:https://gitee.com/zhenghuisheng/rocketPageHome
1. docker安装rocketMq
docker拉取rocketmq的镜像,这里推荐4.9.4版本,因此这里还是拉取4.9.4的镜像
docker pull apache/rocketmq:4.9.4
启动nameServer,同时设置初始的堆内存大小
//运行新的nameServer
docker run -d --name rmqnamesrv -p 9876:9876 -e "JAVA_OPT_EXT=-Xms512m -Xmx512m -Xmn256m" apache/rocketmq:4.9.4 sh mqnamesrv
在执行启动broker命令前,需要在配置文件中先设置一些参数,在 /root/rocketmq/broker.conf
配置文件中,这个文件就是linux环境下的原生文件,用于挂载映射到容器内部,没有这个文件的话需要创建一下,下面的namesrvAddr和brokerIP1里面的ip,需要替换成自己服务器的ip
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
listenPort=10911
namesrvAddr=159.75.102.237:9876
brokerIP1=159.75.102.237
启动broker,这里是4.x的版本启动方式,同时调整了初始的堆栈大小,因为默认的是4g内存,像我总共只有2核4g的服务器,刚启动就直接把内存给撑爆了,因此需要适当的去调整一下
//运行broker
docker run -d --name rmqbroker -p 10911:10911 -p 10909:10909 -e "NAMESRV_ADDR=159.75.102.237:9876" -e "JAVA_OPT_EXT=-Xms512m -Xmx512m -Xmn256m -Duser.home=/home/rocketmq" -v /root/rocketmq/broker.conf:/opt/rocketmq/conf/broker.conf apache/rocketmq:4.9.4 sh mqbroker -c /opt/rocketmq/conf/broker.conf -n 159.75.102.237:9876
执行完这两条命令之后,执行在运行容器的命令即可,broker和nameserver全部启动起来了
docker ps
然后去对应的服务器把防火墙端口打开,分别是nameServer的9876端口和broker对应的10911、10909端口
2. rocketMq基本使用
2.1,创建topic主题
创建topic主题,可以直接在容器内部手动的去创建主题,进入broker容器内部,然后先创建一个测试的主题,如我这边新建一个 zhsTopic 的主题
# 进入broker容器内部
docker exec -it rmqbroker bash
cd /home/rocketmq/rocketmq-4.9.4/bin
export NAMESRV_ADDR=159.75.102.237:9876
# 创建 topic,绑定到默认集群和 broker 上
sh mqadmin updateTopic -n 159.75.102.237:9876 -c DefaultCluster -t zhsTopic
后续出现 create topic to 172.17.0.3:10911 success.
表示主题创建成功
2.2,java基础代码测试
引入项目依赖,我调试的源码版本是4.9.4,所以后续都通过这个
<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>4.9.4</version>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version>
</dependency>
接下来通过java程序模拟两个客户端,消费者的代码如下,setNamesrvAddr需要设置成对应的ip和开放的端口号,主题设置成自定义的主题
/**** @Author zhenghuisheng* @Date:2025/4/15 19:24*/
public class SimpleConsumer {public static void main(String[] args) throws Exception {DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("demo-consumer-group");consumer.setNamesrvAddr("159.75.102.237:9876");consumer.subscribe("zhsTopic", "*");consumer.registerMessageListener(new MessageListenerConcurrently() {@Overridepublic ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {for (MessageExt msg : msgs) {System.out.printf("收到消息:%s%n", new String(msg.getBody()));}return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;}});consumer.start();System.out.println("消费者已启动");}
}
生产者的代码如下,同样也是设置对应的ip和端口以及主题,启动成功后手动销毁结束一下
/**** @Author zhenghuisheng* @Date:2025/4/15 19:24*/
public class SimpleProducer {public static void main(String[] args) throws Exception {DefaultMQProducer producer = new DefaultMQProducer("demo-producer-group");producer.setNamesrvAddr("159.75.102.237:9876");producer.start();Message msg = new Message("zhsTopic", "TagA", "Hello RocketMQ!".getBytes());SendResult sendResult = producer.send(msg);System.out.printf("发送结果:%s%n", sendResult);producer.shutdown();}
}
最后先启动消费者,然后再启动生产者,其对应的日志如下
生产者日志:发送结果:SendResult [sendStatus=SEND_OK, msgId=7F0000013EF818B4AAC26B8EE9230000, offsetMsgId=9F4B66ED00002A9F0000000000000178, messageQueue=MessageQueue [topic=zhsTopic, brokerName=broker-a, queueId=3], queueOffset=0]
21:15:27.970 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[159.75.102.237:9876] result: true
21:15:27.973 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[159.75.102.237:10911] result: true消费者日志:
消费者已启动
收到消息:Hello RocketMQ!
2.3,结合springboot使用
一般整合springboot时,都要引入对应的starer让spring自动注入到容器中,因此这里也引入对应的starer,这道理版本选择2.2.3即可
<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.3</version>
</dependency>
然后消费者代码如下,直接@Service或者@Component都可以,使用注解 RocketMQMessageListener 即可监听消息并且消费
/**** @Author zhenghuisheng* @Date:2025/4/21 21:22*/
@Service
@RocketMQMessageListener(topic = IndexConstant.CUSTOM_TOPIC, consumerGroup = "demo-consumer-group")
public class MQConsumerService implements RocketMQListener<String> {public void onMessage(String message) {System.out.println("收到消息: " + message);}}
常量如下,定义上面要取的topic主题
@Data
public class IndexConstant implements Serializable {public static final String CUSTOM_TOPIC = "zhsTopic";
}
生产者就比较简单,直接使用这个 RocketMQTemplate 模板即可,内部是使用刚刚引入的starer中的注解
/**** @Author zhenghuisheng* @Date:2025/4/21 21:21*/
@Slf4j
@Service
public class MQProducerService {@Resourceprivate RocketMQTemplate rocketMQTemplate;public void sendMessage(String message) {log.info("发送的主题为,{} --- 消息为,{}", IndexConstant.CUSTOM_TOPIC, message);rocketMQTemplate.convertAndSend(IndexConstant.CUSTOM_TOPIC, message);}
}
最后定义一个controller发送消息即可,消息从接口处传入
/**** @Author zhenghuisheng* @Date:2025/4/21 21:28*/
@RestController
@RequestMapping("/mq")
@Slf4j
public class MqController {@Resourceprivate MQProducerService mqProducerService;@GetMapping("/sendMessage")public R<String> sendMessage(String message) {mqProducerService.sendMessage(message);return R.ok(message);}
}
3. 安装可视化界面
在使用rocketmq时,可以用官方推荐的可视化界面进行查看消息的消费情况以及集群等问题,对相关问题排查也比较友好,因此这里选择使用官方推荐的 https://github.com/apache/rocketmq-dashboard/tags ,这里目前有两个版本,2.0版本是为了rocketMq5.0版本之后使用的,会涉及到一些grpc等,因此先使用下面的1.0版本
可以将代码拉到本地,解压后本地先进行一些配置修改,如yml中 namesrvAddr 地址,以及修改一些默认的端口号等
rocketmq.config.namesrvAddr=
server.port=8888
随后本地通过maven打一个jar包,将这个jar包发到服务器上面,随后可以看到此时已经build success
随后将本地打出来的包发布到服务器上,也可以在本地执行一下,是可以运行的
我把它放在/opt/rocketmq目录下面,由于java的可移植性,windows打出的包linux也可以运行
随后执行服务启动命令,java -jar rocketmq-dashboard-1.0.0.jar
即可,端口号是改成了8888
随后打开ip+端口号,像8888端口号的话,需要开启防火墙,开放端口号,直接进入这个可视化界面这样就完成可视化几面的安装
可以看到刚刚新建的主题zhsTopic, 可以在这里查看状态,手动的发消息等
以及消费者状态,看每个topic主题消费的情况等,以及生产者等等
这个可视化界面在后续用到时也可以详细的描述他的功能
相关文章:
【RocketMq源码篇-01】环境搭建、基本使用、可视化界面
RocketMq源码核心篇整体栏目 内容链接地址【一】环境搭建、基本使用、可视化界面https://zhenghuisheng.blog.csdn.net/article/details/147481401 环境搭建、基本使用、可视化界面 一,RocketMq源码分析1. docker安装rocketMq2. rocketMq基本使用2.1,创建…...
Mysql的深度分页查询优化
一、深度分页为什么慢? 当执行 SELECT * FROM orders ORDER BY id LIMIT 1000000, 10 时: MySQL 会扫描前 1,000,010 行,丢弃前 100 万行,仅返回 10 行。偏移量(offset)越大,扫描行数越多&…...
OpenCv高阶(十一)——物体跟踪
文章目录 前言一、OpenCV 中的物体跟踪算法1、均值漂移(Mean Shift):2、CamShift:3、KCF(Kernelized Correlation Filters):4、MIL(Multiple Instance Learning)…...
第一章:Model Context Protocol (MCP)
Chapter 1: Model Context Protocol (MCP) 🌟 为什么需要MCP? 想象你正在训练一只小狗,希望它能听懂你的指令并执行任务。但如果你和小狗用不同语言交流,它可能完全不知道你的意思。类似地,大型语言模型(L…...
【SAP PP】COOIS报表分析
本文目录 一、基本查询操作 二、订单参数文件 三、COOIS报表增强BADI COOIS报表是PP模块核心报表,是系统中一个功能强大的标准报表,COOIS可查询查询生产订单的状态、进度、组件、工序、报工等信息的综合型报表,,关联了生产订单…...
2025上海车展|紫光展锐发布新一代旗舰级智能座舱芯片平台A888
4月24日,在第二十一届上海国际汽车工业展览会(以下简称“上海车展”)期间,紫光展锐重磅推出新一代旗舰级智能座舱芯片平台A8880,以强劲实力全面助力汽车座舱智能化迈向新征程。 三大核心能力,紧抓市场机遇 …...
蓝牙4.0与蓝牙5.0的区别
蓝牙4.0与蓝牙5.0的主要区别: 传输速度:蓝牙5.0的传输速度是蓝牙4.0的两倍,理论速率可达2Mbps,而蓝牙4.0为1Mbps。 传输距离:蓝牙5.0的传输距离是蓝牙4.0的四倍,在开放空间可达300米,而蓝牙4.0…...
Vue 的单文件组件(.vue 文件)script 标签的使用说明
在 Vue 的单文件组件(.vue 文件)中,最多可以编写 2 个 <script> 标签,但需要满足特定条件: 1. Vue 3 的情况(主流用法) 从 Vue 3.2 开始,官方支持以下两种形式共存࿱…...
TIM输入捕获知识部分
越往左,频率越高;越往右,频率越低。【越紧凑,相同时间,次数越多】 计算频率的方法:测评法、测周法、中界频率。 频率的定义:1s内出现了多少个重复的周期 测评法就是从频率的定义出发的&#…...
【数据可视化-30】Netflix电影和电视节目数据集可视化分析
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
多线程事务?拿捏!
场景:有一批1万或者10万数据,插入数据库,怎么做 事务中进行批量提交 publList<List<OrderPo>> partition Lists.partition(list, 450);StopWatch stopWatch new StopWatch();stopWatch.start();// 顺序插入for (List<OrderPo> sub…...
Spring Boot 自动配置深度解析:从源码结构到设计哲学
Spring Boot 自动配置深度解析:从源码结构到设计哲学 为什么自动配置如此重要? 在传统 Spring 开发中,开发者要手动配置大量 XML 或 JavaConfig,过程繁琐、重复且容易出错。Spring Boot 引入自动配置机制,极大地简化…...
Linux下载与安装——笔记
Linux 是一种自由和开放源代码的 操作系统(OS),其核心(Kernel)由 Linus Torvalds 于 1991 年首次发布。 1、选择适合的 Linux 发行版 根据使用场景和技术水平选择: 新手入门:Ubuntu(…...
09前端项目----分页功能
分页功能 分页器的优点实现分页功能自定义分页器先实现静态分页器调试分页器动态数据/交互 Element UI组件 分页器的优点 电商平台同时展示的数据很多,所以采用分页功能实现分页功能 Element UI已经有封装好的组件,但是也要掌握原理,以及自定…...
头歌之动手学人工智能-机器学习 --- PCA
目录 第1关:维数灾难与降维 第2关:PCA算法流程 任务描述 编程要求 测试说明 第3关:sklearn中的PCA 任务描述 编程要求 测试说明 第1关:维数灾难与降维 第2关:PCA算法流程 任务描述 本关任务:补充…...
Spring 中的循环引用问题
本章来聊聊Spring 中的循环引用问题该如何解决。这里聊的很粗糙,并没有那么细节,只是大概了解了一点。 什么是循环引用? 如下图所示: 图中有两个类,一个 Class A ,A 中又引用了 B,Class B 中又…...
SIGGRAPH投稿相关官方指导
author instruction https://www.siggraph.org/preparing-your-content/author-instructions/ 使用latex模板 https://research.siggraph.org/blog/guides/how-to-use-the-acm-siggraph-tog-latex-template/ 格式要求(字体、页面大小等) https://sa202…...
Python学习笔记(三)(程序流程控制)
文章目录 一、条件语句(if/elif/else)语法:示例: 二、循环语句1. for 循环语法:示例: 2. while 循环语法:示例: 三、循环控制语句1. break:立即终止循环2. continue&…...
onnx注册cpu版flashattention
摘要 本教程展示了如何在 ONNX Runtime 中注册一个 CPU 可执行的 FlashAttention 算子。首先,可以直接升级到 ONNX Runtime v1.16 及以上,以获得内置的 FlashAttention CPU 实现citeturn0search2;其次,演示了如何通过 ONNX Runtime 的 Custom Op 接口自定义实现并注…...
WebAssembly:开启高性能Web应用新时代
一、引言 随着互联网技术的飞速发展,Web应用的复杂度和性能要求越来越高。传统的Web开发技术,如JavaScript,虽然功能强大,但在处理复杂计算和高性能需求时仍存在一些局限性。WebAssembly(简称Wasm)作为一种…...
【前端】手写代码输出题易错点汇总
不定期补充。 目录 异步事件循环this作用域/变量提升/闭包原型/继承 异步事件循环 const promise new Promise((resolve, reject) > {console.log(1);console.log(2); }); promise.then(() > {console.log(3); }); console.log(4); //1 //2 //4promise.then 是微任务&…...
STM32F103_HAL库+寄存器学习笔记20 - CAN发送中断+ringbuffer + CAN空闲接收中断+接收所有CAN报文+ringbuffer
导言 如上所示,在[[STM32F103_HAL库寄存器学习笔记19 - CAN发送中断CAN接收中断接收所有CAN报文ringbuffer数据结构]]的基础上,为CAN发送端也引入了ringbuffer(环形缓冲区)机制。CAN发送有三个发送邮箱,为什么还另外需…...
小白自学python第二天
学习python的第二天 一、判断语句 1、布尔类型和比较运算符 1、布尔类型 表示现实生活中的逻辑,真(True,用数字1表示)和假(False,用数字0表示) 2、布尔类型变量的定义 变量的名称 布尔类…...
JavaScript 异步编程与请求取消全指南
JavaScript 异步编程与请求取消全指南 涵盖:同步/异步、Promise、async/await、AbortController、前后端协作 一、同步与异步 1. 同步(Synchronous) 定义:代码按顺序执行,前一步完成才能执行下一步。特点࿱…...
Redis 核心应用场景
高性能缓存 Redis 作为内存数据库,读写性能可达10万 QPS,适合缓存热点数据(如商品详情、用户会话),显著降低数据库压力。通过设置过期时间(TTL)自动清理非热点数据,推荐结合allkeys-…...
KMS工作原理及其安全性分析
在当今数字化时代,数据安全已经成为企业和个人最为关注的话题之一。随着云计算和大数据的快速发展,如何安全地管理密钥成为了一个重要的挑战。KMS(Key Management Service,密钥管理服务)作为一种专业的密钥管理解决方案…...
施磊老师基于muduo网络库的集群聊天服务器(六)
文章目录 客户端开发开始客户端首页面功能为何不逐行开发?客户端CMake代码搭配知识补充--有很多漏的客户端main-登录,注册,退出群组有问题测试 客户端好友添加与聊天功能表驱动设计:commandMapcommandHandlerMap为什么都是int, string添加好友和聊天功能…...
有关字体,语言,字符编码相关的基础知识,询问chatgpt所得
学习这个知识点的背景是,我需要做一个 在canvas 上书写矢量文本的功能, 使用opentype来加载字体文件,并将内容转换为 svg,导入画布。 但是有些字体文件 是不包含 一些其他语言的字符的。就可能出现 “无效字符”。 花了点时间研究…...
Obsidian和Ollama大语言模型的交互过程
之前的文章中介绍了Obsidian配合Ollama的使用案例,那么它们是如何配合起来的呢?其实这个问题并不准确,问题的准确描述应该是Obsidian的Copilot插件是如何与Ollama大语言模型交互的。因为Obsidian在这里只是一个载体,核心功能还是C…...
架构-数据库系统
数据库系统 一、数据库系统概述 (一)课程核心模块 覆盖数据库设计、关系代数、规范化理论、数据控制四大核心模块,旨在构建从理论到实践的完整知识体系至。 (二)典型应用场景 数据管理:学生信息管理&a…...
【C到Java的深度跃迁:从指针到对象,从过程到生态】第三模块·面向对象深度进化 —— 第十二章 接口:比C函数指针更强大的契约
一、从函数指针到接口契约 1.1 C函数指针的本质限制 C语言通过函数指针实现回调机制,但存在根本性缺陷: 回调函数示例: typedef void (*Logger)(const char*); void process_data(int data, Logger logger) { // ... logger("Pro…...
【HFP】蓝牙语音通话控制深度解析:来电拒接与通话终止协议
目录 一、来电拒接的核心流程与信令交互 1.1 拒接场景的分类与触发条件 1.2 HF 端拒接流程 1.3 AG 端拒接流程 二、通话终止流程:主动断开与异常中断 2.1 终止场景的界定 2.2 HF 端终止流程 2.3 AG 端终止流程 三、信令协议的核心要素:AT 命令与…...
linux 中断子系统 层级中断编程
虚拟中断控制器代码: #include<linux/kernel.h> #include<linux/module.h> #include<linux/clk.h> #include<linux/err.h> #include<linux/init.h> #include<linux/interrupt.h> #include<linux/io.h> #include<linu…...
continue插件实现IDEA接入本地离线部署的deepseek等大模型
文章目录 前言一、IDEA安装continue二、continue部署本地大模型三、continue聊天窗口使用deepseek R1四、continue批量接入硅基流动的模型API 前言 亲爱的家人们,创作很不容易,若对您有帮助的话,请点赞收藏加关注哦,您的关注是我…...
Redis-缓存应用 本地缓存与分布式缓存的深度解析
Redis缓存场景与策略:本地缓存与分布式缓存的深度解析 在当今高并发、低延迟的互联网架构中,缓存技术是优化系统性能的核心手段之一。Redis作为分布式缓存的标杆,与本地缓存共同构成了缓存体系的两大支柱。然而,两者的适用场景与…...
关于按键映射软件的探索(其一)
那么先说结论——重构了一次,我还是失败了,失败于拓展调整个性化的设计,不过我还是实现了按键监测然后显示的功能。只不过是说我对于WPF软件等的封装和软窗口的功能还是不怎么熟悉。 引言 在许多游戏玩家中,高难度操作(…...
测试基础笔记第十一天
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、查询连接1.内连接2.左连接3.右连接4.左右连接的必要性5.自关联6.普通查询7.子查询8.子查询充当数据源 二、数据库高级扩展内容1.外键2.索引3.验证索引效果案例实…...
优选算法第十讲:字符串
优选算法第十讲:字符串 1.最长公共前缀2.最长回文子串3.二进制求和4.字符串相乘 1.最长公共前缀 2.最长回文子串 3.二进制求和 4.字符串相乘...
RK3588芯片NPU的使用:官方rknn_yolov5_android_apk_demo运行与解读
一、本文的目标 本文将完成两项任务: 官方的调用摄像头动态目标识别例子运行在rk3588的开发板上。解读源码以增加对rknn开发的认识。二、开发环境说明 主机系统:Windows 11目标设备:搭载RK3588芯片的安卓开发板核心工具:Android Studio Koala | 2024.1.1 Patch 2,NDK 27.…...
面试篇:Spring Boot
基础概念 Spring Boot的核心优势是什么? Spring Boot 的核心优势如下: 自动配置:根据项目中的依赖自动进行配置,减少了大量的手动配置工作。 内嵌服务器:内置 Tomcat、Jetty 等容器,应用可以直接运行为一…...
开源漏洞扫描器:OpenVAS
一、OpenVAS介绍 OpenVAS (Open Vulnerability Assessment System) 是一款功能强大的开源漏洞扫描器。它由 Greenbone Networks 开发和维护,是 Greenbone 安全管理器 (GSM) 产品的基础,同时也有免费的社区版本(Greenbone Community Edition&…...
PCB封装主要组成元素
PCB(Printed Circuit Board,印刷电路板)封装是指将电子元件固定在 PCB 上,并实现电气连接的方式。主要包括以下几类。 1. 焊盘(Pad) 作用:焊盘是 PCB 封装中最重要的元素之一,它是…...
STC8H DMA 串口1全双工中断方式收发通讯C语言
/************* 功能说明 ************** 本例程基于STC8H8K64U为主控芯片的实验箱9进行编写测试,STC8H系列带DMA模块的芯片可通用参考. 串口1全双工中断方式收发通讯程序。 通过PC向MCU发送数据, MCU将收到的数据自动存入DMA空间. 当DMA空间存满设置大小的…...
考研英一学习笔记
2024 年全国硕士研究生招生考试 英语(一)试题 (科目代码:201) Section Ⅰ Use of English Directions: Read the following text. Choose the best word(s) for each numbered blank and mark A, B, C or D on the ANS…...
深度理解spring——BeanFactory的实现
BeanFactory Spring之BeanFactory什么是BeanFactoryApplicationContext相对BeanFactory实现的功能性扩展1. MessageSource2. ResourcePatternResolver3. ApplicationEventPublisher4. EnvironmentCapable通用ApplicationContext实践实现BeanFactoryBeanFactory后处理器排序让谁…...
半导体---检测和量测
目录 1.简介2.AOI(检测) 1.简介 半导体晶圆制造前道量测和检测设备。 公司产品涵盖光学薄膜量测、光学关键尺寸量测、光学衍射套刻量测、光学集成量测、X射线薄膜量测、X射线材料性能量测、X射线成分及表面污染量测等系列产品及解决方案。 半导体领域的量测和AOI如同半导体制造…...
CentOS 7 磁盘分区详细教程
CentOS 7 磁盘分区详细教程 在服务器管理和运维过程中,磁盘分区是一项基础且重要的操作。合理的磁盘分区可以提高数据存储的安全性、高效性,方便系统管理与维护。本文将详细介绍在 CentOS 7 系统中进行磁盘分区的具体步骤和方法。 一、准备工作 1.1 确…...
EasyRTC音视频实时通话在线教育解决方案:打造沉浸式互动教学新体验
一、方案概述 EasyRTC是一款基于WebRTC技术的实时音视频通信平台,为在线教育行业提供了高效、稳定、低延迟的互动教学解决方案。本方案将EasyRTC技术深度整合到在线教育场景中,实现师生间的实时音视频互动等核心功能,打造沉浸式的远程学习体…...
栈(Stack)和队列(Queue)
栈 栈(stack)是一种特殊的线性表,只允许在固定的一端进行插入和删除操作。 我们可以将栈近似看作一个桶,要取出桶底的元素,就要将桶顶的元素先取出,再将底部元素取出,也可以叫做后进先出。 这…...
1、AI及LLM基础:Python语法入门教程
Python语法入门教程 这是一份全面的Python语法入门教程,涵盖了注释、变量类型与操作符、逻辑运算、list和字符串、变量与集合、控制流和迭代、模块、类、继承、进阶等内容,通过详细的代码示例和解释,帮助大家快速熟悉Python语法。 文章目录 Python语法入门教程一、注释二…...