207、SpringBoot 整合 RabbitMQ 实现消息的发送 与 接收(监听器)
目录
- ★ 发送消息
- ★ 创建队列的两种方式
- 代码演示
- 需求1:发送消息
- 1、ContentUtil 先定义常量
- 2、RabbitMQConfig 创建队列的两种方式之一:
- 配置式:
- 问题:
- 3、MessageService 编写逻辑
- PublishController 控制器
- application.properties 配置属性
- 测试:消息发送
- ★ 接收消息
- 代码演示:
- 测试: 消息接收
- ★ 定制监听器容器工厂
- 完整代码:
- application.properties RabbitMQ的连接等属性配置
- ContentUtil 常量工具类
- RabbitMQConfig 配置式创建消息队列
- MessageService 发送消息的业务代码
- PublishController.java 发送消息的控制层
- MyRabbitMQListener 监听器,监听消息队列
- pom.xml

★ 发送消息
- Spring Boot可以将AmqpAdmin和AmqpTemplate注入任何其他组件,接下来该组件即可通过AmqpAdmin来管理Exchange、队列和绑定,还可通过AmqpTemplate来发送消息。 - Spring Boot还会自动配置一个RabbitMessagingTemplate Bean(RabbitAutoConfiguration负责配置),如果想使用它来发送、接收消息,可使用RabbitMessagingTemplate代替上面的AmqpTemplate,两个Template的注入方式完全相同。

★ 创建队列的两种方式
方式一(编程式):在程序中通过AmqpAdmin创建队列。方式二(配置式):在容器中配置 org.springframework.amqp.core.Queue 类型的Bean,RabbitMQ将会自动为该Bean创建对应的队列。
代码演示
需求1:发送消息
1、ContentUtil 先定义常量

2、RabbitMQConfig 创建队列的两种方式之一:
配置式:
在容器中配置 org.springframework.amqp.core.Queue 类型的Bean,RabbitMQ将会自动为该Bean创建对应的队列。
就是在配置类中创建一个生成消息队列的@Bean。
问题:
用 @Configuration 注解声明为配置类,但是项目启动的时候没有自动生成这个队列。
据了解是因为RabbitMQ使用了懒加载,大概是没有消费者监听这个队列,就没有创建。
但是当我写后面的代码后,这个消息队列就生成了,但是并没有消费者去监听这个队列。
这有点想不通。
不知道后面是哪里的代码让这个配置类能成功声明这个消息队列出来。

水落石出:
经过测试:
在下面的MessageService 这个类中,依赖注入了 AmqpAdmin 和 AmqpTemplate 这两个对象,当我们通过这两个对象去声明队列、Exchange 和绑定的时候,配置类中的创建消息队列的bean就能成功创建队列。
这张图结合下面的 MessageService 中的代码就可得知:
这是依赖注入 AmqpAdmin 和 AmqpTemplate 这两个对象的有参构造器中声明的。

3、MessageService 编写逻辑
声明Exchange 、 消息队列 、 Exchange和消息队列的绑定、发送消息的方法等



PublishController 控制器

application.properties 配置属性


测试:消息发送
成功生成队列

发送消息测试


★ 接收消息
@RabbitListener 注解修饰的方法将被注册为消息监听器方法。
【备注】:该注解可通过queues属性指定它要监听的、已有的消息队列,它也可使用queuesToDeclare来声明队列,并监听该队列。- 如果没有显式配置监听器容器工厂(RabbitListenerContainerFactory),Spring Boot会在容器中自动配置一个SimpleRabbitListenerContainerFactory Bean作为监听器容器工厂,如果希望使用DirectRabbitListenerContainerFactory,可在application.properties文件中添加如下配置:spring.rabbitmq.listener.type=direct▲ 如果在容器中配置了MessageRecoverer或MessageConverter,它们会被自动关联到默认的监听器容器工厂。
代码演示:
创建个消息队列的监听器就可以了。
@RabbitListener 注解修饰的方法将被注册为消息监听器方法。
该注解可通过queues属性指定它要监听的、已有的消息队列,
它也可使用queuesToDeclare来声明队列,并监听该队列,
还可以用 bindings 进行 Exchange和queue的绑定操作。

测试: 消息接收

发送消息和监听消息

★ 定制监听器容器工厂
▲ 如果要定义更多的监听器容器工厂或覆盖默认的监听器容器工厂,可通过Spring Boot提供的SimpleRabbitListenerContainerFactoryConfigurer
或DirectRabbitListenerContainerFactoryConfigurer来实现,它们可对SimpleRabbitListenerContainerFactory
或DirectRabbitListenerContainerFactory进行与自动配置相同的设置。 ▲ 有了自定义的监听器容器工厂之后,可通过@RabbitListener注解的containerFactory属性来指定使用自定义的监听器容器工厂,
例如如下注解代码:@RabbitListener(queues = "myQueue1", containerFactory="myFactory")
完整代码:
application.properties RabbitMQ的连接等属性配置
# 配置连接 RabbitMQ 的基本信息------------------------------------------------------
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
# 下面属性可配置多个以逗号隔开的连接地址,一旦配置了该属性,host 和 port 属性就会被忽略
# spring.rabbitmq.addresses=
spring.rabbitmq.username=ljh
spring.rabbitmq.password=123456
# 连接虚拟主机
spring.rabbitmq.virtual-host=my-vhost01# 配置RabbitMQ的缓存相关信息--------------------------------------------------------
# 指定缓存 connection ,还是缓存 channel
spring.rabbitmq.cache.connection.mode=channel
# 指定可以缓存多少个 Channel
spring.rabbitmq.cache.channel.size=50
# 如果选择的缓存模式是 connection , 那么就可以配置如下属性
# spring.rabbitmq.cache.connection.size=15# 配置 和 RabbitTemplate 相关的属性--------------------------------------------------
# 指定 RabbitTemplate 发送消息失败时会重新尝试
spring.rabbitmq.template.retry.enabled=true
# RabbitTemplate 发送消息失败后每隔1秒重新尝试发送消息
spring.rabbitmq.template.retry.initial-interval=1s
# RabbitTemplate 发送消息失败时,最多尝试重新发送消息的次数
spring.rabbitmq.template.retry.max-attempts=5
# 设置每次尝试重新发送消息的时间间隔是一个等比数列:1s, 2s, 4s, 8s, 16s
# 第一次等1s后尝试,第二次等2s后尝试,第三次等4s后尝试重新发送消息......
spring.rabbitmq.template.retry.multiplier=2
# 指定发送消息时默认的Exchange名
spring.rabbitmq.template.exchange=""
# 指定发送消息时默认的路由key
spring.rabbitmq.template.routing-key="test"# 配置和消息监听器的容器工厂相关的属性--------------------------------------------------
# 指定监听器容器工厂的类型
spring.rabbitmq.listener.type=simple
# 指定消息的确认模式
spring.rabbitmq.listener.simple.acknowledge-mode=auto
# 指定获取消息失败时,是否重试
spring.rabbitmq.listener.simple.retry.enabled=true
# 发送消息失败时,最多尝试重新发送消息的次数
spring.rabbitmq.listener.simple.retry.max-attempts=2
# 发送消息失败后每隔1秒重新尝试发送消息
spring.rabbitmq.listener.simple.retry.initial-interval=1s
ContentUtil 常量工具类
package cn.ljh.app.rabbitmq.util;//常量
public class ContentUtil
{//定义Exchange的常量-----fanout:扇形,就是广播类型public static final String EXCHANGE_NAME = "boot.fanout";//消息队列数组public static final String[] QUEUE_NAMES =new String[] {"queue_boot_01","queue_boot_02","queue_boot_03"};}
RabbitMQConfig 配置式创建消息队列
package cn.ljh.app.rabbitmq.config;import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;//配置式:在容器中配置 org.springframework.amqp.core.Queue 类型的Bean,RabbitMQ将会自动为该Bean创建对应的队列
//声明这个类为配置类
@Configuration
public class RabbitMQConfig
{//用配置式的方式在RabbitMQ中定义队列@Beanpublic Queue myQueue(){//在容器中配置一个 Queue Bean,Spring 就会为它在 RabbitMQ 中自动创建对应的 Queuereturn new Queue("queue_boot", /* Queue 消息队列名 */true, /* 是否是持久的消息队列 */false, /* 是否是独占的消息队列,独占就是是否只允许该消息消费者消费该队列的消息 */false, /* 是否在没有消息的时候自动删除消息队列 */null /* 额外的一些消息队列的参数 */);}
}
MessageService 发送消息的业务代码
声明Exchange 、Queue ,Exchange 绑定Queue,发送消息代码
package cn.ljh.app.rabbitmq.service;import cn.ljh.app.rabbitmq.util.ContentUtil;
import org.springframework.amqp.core.*;
import org.springframework.stereotype.Service;//业务逻辑:声明Exchange 和 Queue 消息队列,发送消息的方法
@Service
public class MessageService
{//AmqpAdmin来管理Exchange、队列和绑定private final AmqpAdmin amqpAdmin;//AmqpTemplate来发送消息private final AmqpTemplate amqpTemplate;//通过有参构造器进行依赖注入public MessageService(AmqpAdmin amqpAdmin, AmqpTemplate amqpTemplate){this.amqpAdmin = amqpAdmin;this.amqpTemplate = amqpTemplate;//由于声明 Exchange 、 队列 、 绑定(Exchange绑定队列),都只需要做一次即可,因此放在此处构造器中完成即可//创建 fanout 类型的 Exchange ,使用FanoutExchange实现类FanoutExchange exchange = new FanoutExchange(ContentUtil.EXCHANGE_NAME,true, /* Exchange是否持久化 */false, /* 是否自动删除 */null /* 额外的参数属性 */);//声明 Exchangethis.amqpAdmin.declareExchange(exchange);//此处循环声明 Queue ,也相当于代码式创建 Queuefor (String queueName : ContentUtil.QUEUE_NAMES){Queue queue = new Queue(queueName, /* Queue 消息队列名 */true, /* 是否是持久的消息队列 */false, /* 是否是独占的消息队列,独占就是是否只允许该消息消费者消费该队列的消息 */false, /* 是否在没有消息的时候自动删除消息队列 */null /* 额外的一些消息队列的参数 */);//此处声明 Queue ,也相当于【代码式】创建 Queuethis.amqpAdmin.declareQueue(queue);//声明 Queue 的绑定Binding binding = new Binding(queueName, /* 指定要分发消息目的地的名称--这里是要发送到这个消息队列里面去 */Binding.DestinationType.QUEUE, /* 分发消息目的的类型,指定要绑定 queue 还是 Exchange */ContentUtil.EXCHANGE_NAME, /* 要绑定的Exchange */"x", /* 因为绑定的Exchange类型是 fanout 扇形(广播)模式,所以路由key随便写,没啥作用 */null);//声明 Queue 的绑定amqpAdmin.declareBinding(binding);}}//发送消息的方法public void publish(String content){//发送消息amqpTemplate.convertAndSend(ContentUtil.EXCHANGE_NAME, /* 指定将消息发送到这个Exchange */"", /* 因为Exchange是fanout 类型的(广播类型),所以写什么路由key都行,都没意义 */content /* 发送的消息体 */);}
}
PublishController.java 发送消息的控制层
package cn.ljh.app.rabbitmq.controller;import cn.ljh.app.rabbitmq.service.MessageService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;//发送消息
@RestController
public class PublishController
{private final MessageService messageService;//有参构造器进行依赖注入public PublishController(MessageService messageService){this.messageService = messageService;}@GetMapping("/publish/{message}")//因为{message}是一个路径参数,所以方法接收的时候需要加上注解 @PathVariablepublic String publish(@PathVariable String message){//发布消息messageService.publish(message);return "消息发布成功";}}
MyRabbitMQListener 监听器,监听消息队列
package cn.ljh.app.rabbitmq.listener;import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;//监听器:监听消息队列并进行消费
@Component
public class MyRabbitMQListener
{//queues 指定监听已有的哪个消费队列@RabbitListener(queues = "queue_boot_01")public void onQ1Message(String message){System.err.println("从 queue_boot_01 消息队列接收到的消息:" + message);}//queues 指定监听已有的哪个消费队列@RabbitListener(queues = "queue_boot_02")public void onQ2Message(String message){System.err.println("从 queue_boot_02 消息队列接收到的消息:" + message);}//queues 指定监听已有的哪个消费队列//还可以用 queuesToDeclare 直接声明并监听该队列,还可以用 bindings 进行Exchange和queue的绑定@RabbitListener(queuesToDeclare = @Queue(name = "queue_boot_03",durable = "true",exclusive = "false",autoDelete = "false"),admin = "amqpAdmin" /*指定声明Queue,绑定Queue所用的 amqpAdmin,不指定的话就用容器中默认的那一个 */)public void onQ3Message(String message){System.err.println("从 queue_boot_03 消息队列接收到的消息:" + message);}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.5</version></parent><groupId>cn.ljh</groupId><artifactId>rabbitmq_boot</artifactId><version>1.0.0</version><name>rabbitmq_boot</name><properties><java.version>11</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- RabbitMQ 的依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><!-- web 依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 开发者工具的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><!-- lombok 依赖--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>相关文章:
207、SpringBoot 整合 RabbitMQ 实现消息的发送 与 接收(监听器)
目录 ★ 发送消息★ 创建队列的两种方式代码演示需求1:发送消息1、ContentUtil 先定义常量2、RabbitMQConfig 创建队列的两种方式之一:配置式:问题: 3、MessageService 编写逻辑PublishController 控制器application.properties 配…...
想要精通算法和SQL的成长之路 - 滑动窗口和大小根堆
想要精通算法和SQL的成长之路 - 滑动窗口和大小根堆 前言一. 大小根堆二. 数据流的中位数1.1 初始化1.2 插入操作1.3 完整代码 三. 滑动窗口中位数3.1 在第一题的基础上改造3.2 栈的remove操作 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 大小根堆 先来说下大小根堆是什…...
Python算法练习 10.15
leetcode 2130 链表的最大孪生和 在一个大小为 n 且 n 为 偶数 的链表中,对于 0 < i < (n / 2) - 1 的 i ,第 i 个节点(下标从 0 开始)的孪生节点为第 (n-1-i) 个节点 。 比方说,n 4 那么节点 0 是节点 3 的孪…...
智能防眩目前照灯系统控制器ADB
经纬恒润的自适应远光系统—— ADB(Adaptive Driving Beam) 是一种能够根据路况自适应变换远光光型的智能远光控制系统。根据本车行驶状态、环境状态以及道路车辆状态,ADB 系统自动为驾驶员开启或退出远光。同时,根据车辆前方视野…...
若依 ruoyi 路径 地址 # 井号去除
export default new Router({mode: history, // history 去掉url中的# 、hash 包含#号scrollBehavior: () > ({ y: 0 }),routes: constantRoutes })...
Elasticsearch 和 Arduino:一起变得更好!
作者:Enrico Zimuel 使用 Arduino IoT 设备与 Elasticsearch 和 Elastic Cloud 进行通信的简单方法 在 Elastic,我们不断寻找简化搜索体验的新方法,并开始关注物联网世界。 来自物联网的数据收集可能非常具有挑战性,尤其是当我们…...
基于Ubuntu环境Git 服务器搭建及使用
多人合作开发的时候 常常会需要使用代码管理平台,保持代码一致和解决冲突。在工作中我使用过SVN和TFS,本文说明另外一种平台,Git,下面是基于Ubuntu环境安装并简单使用Git服务器。 确认安装git apt install git levilevi-ThinkPa…...
【quartus13.1/Verilog】swjtu西南交大:计组课程设计
实验目的: 通过学习简单的指令系统及其各指令的操作流程,用 Verilog HDL 语言实 现简单的处理器模块,并通过调用存储器模块,将处理器模块和存储器模块连接形成简 化的计算机核心部件组成的系统。 二. 实验内容 1. 底层用 Verilog…...
基于springboot的网上点餐系统论文开题报告
一、选题背景 随着互联网和移动互联网技术的快速发展,网上点餐成为了人们越来越喜欢的一种点餐方式。一些具有创新意识的餐厅也开始逐渐尝试利用互联网技术来提升用户的点餐体验。因此,开发一个基于Spring Boot的网上点餐系统就显得非常必要和重要。 二…...
Hadoop3教程(九):MapReduce框架原理概述
文章目录 简介参考文献 简介 这属于整个MR中最核心的一块,后续小节会展开描述。 整个MR处理流程,是分为Map阶段和Reduce阶段。 一般,我们称Map阶段的进程是MapTask,称Reduce阶段是ReduceTask。 其完整的工作流程如图ÿ…...
使用PyTorch加载数据集:简单指南
💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…...
【考研数学】线性代数第六章 —— 二次型(2,基本定理及二次型标准化方法)
文章目录 引言一、二次型的基本概念及其标准型1.2 基本定理1.3 二次型标准化方法1. 配方法2. 正交变换法 写在最后 引言 了解了关于二次型的基本概念以及梳理了矩阵三大关系后,我们继续往后学习二次型的内容。 一、二次型的基本概念及其标准型 1.2 基本定理 定理…...
Raven2靶机渗透
1. 信息收集 1.1 主机探测 sudo arp-scan -l1.2 端口扫描 nmap -p- -A 192.168.16.185开放了80端口,尝试登录网址查看信息,通过浏览器插件找出指纹 1.3 目录扫描 访问登录界面,发现remember Me怀疑是shiro界面 登录/vendor/界面࿰…...
UE5中双pass解决半透明材质乱序问题
透明度材质乱序问题一直是半透明效果时遇到的比较多的问题,用多pass方案只能说一定程度上解决,当遇到多半透明物体穿插等情况时,仍然不能完美解决。 双pass方案Unity用的比较多,因为Unity支持多个pass绘制。在UE中我们可以以复制多…...
Cisdem Video Player for mac(高清视频播放器) v5.6.0中文版
Cisdem Video Player mac是一款功能强大的视频播放器,适用于 macOS 平台。它可用于播放不同格式的视频文件,并具有一些实用的特性和功能。 Cisdem Video Player mac 中文版软件特点 多格式支持:Cisdem Video Player 支持几乎所有常见的视频格…...
数据库管理-第109期 19c OCM考后感(20231015)
数据库管理-第109期 19c OCM考后感(202301015) 距离上一篇又过了两周多,为啥又卡了这么久,主要是后面几个问题:1. 9月1日的19c OCM upgrade考试木有过,因为有一次免费补考机会就又预约了10月8日的考试&…...
初出茅庐的小李博客之SPI工作模式
SPI的工作模式 SPI(Serial Peripheral Interface)是一种同步串行通信协议,常用于连接微控制器和外围设备。SPI有四种模式,分别是0、1、2、3模式。 0模式:时钟空闲时为低电平,数据在时钟的下降沿采样&#…...
SpringCloud-Bus
一、介绍 (1)bus搭配config可以实现客户端配置自动刷新 (2)bus支持两种消息代理,rabbitmq和kafka (3)使用topic模式分发消息 二、项目搭建(广播) (1&#…...
Adobe2024 全家桶更新了,PS、Ai、AE、PR应用尽有
Adobe2024 全家桶更新了,包含的PS、Ai、AE、PR......个人学习,专业领域都是必不可少的软件都有,需要的不要错过了。 如果你不知道从哪里安装这些工具,小编为大家带来了破J版资源,附上详细的安装包及安装教程。 Mac软件…...
【斗破年番】彩鳞换装美翻,雁落天惨死,萧炎暗杀慕兰三老遇险,彩鳞霸气护夫
Hello,小伙伴们,我是小郑继续为大家深度解析斗破苍穹年番资讯。 斗破苍穹动画已经更新了,小医仙与萧炎相认,三国联军撤退,随后彩鳞与萧炎以及小医仙夜晚相会,一起制定了刺杀行动。从官方公布的第68集预告,彩…...
告别纯Verilog手搓!用Vivado HLS快速搭建你的第一个CNN加速器(ZYNQ平台实战)
从Verilog到Vivado HLS:ZYNQ平台CNN加速器开发实战指南 在FPGA开发领域,传统RTL设计方法正面临越来越复杂的算法实现挑战。以卷积神经网络(CNN)为例,一个简单的三层网络就可能需要数万行Verilog代码,不仅开发周期漫长,…...
VBA循环到底用For、Do While还是Do Until?看完这篇别再傻傻分不清
VBA循环结构深度解析:如何精准选择For、Do While与Do Until? 刚接触VBA时,看到各种循环结构总让人眼花缭乱——For循环、For Each、Do While、Do Until...它们看起来都能完成相似的任务,但实际编码中选错循环类型,轻则…...
Android Studio中文界面终极配置指南:告别英文障碍,提升开发效率
Android Studio中文界面终极配置指南:告别英文障碍,提升开发效率 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePac…...
提升物业服务满意度的物业管理小程序
一、首页核心服务入口基础功能模块:物业缴费、我的房产、通知公告、投诉建议、维修申报、小区活动、家政服务、优惠好物,覆盖业主日常高频需求信息与活动展示:顶部搜索栏:支持关键词检索,快速定位所需服务物业公告&…...
阿里千问Qwen3.5-Omni:全模态大模型的新王者
Qwen3.5-Omni:全模态能力的新巅峰3月30日,阿里发布的千问新一代全模态大模型Qwen3.5-Omni,在音视频理解、识别、交互等215项任务中取得SOTA(性能最佳),超越Gemini-3.1 Pro,成为全球最强的全模态…...
ESP-IDF嵌入式类型工具:轻量级字节与位操作库
1. 项目概述 esp_type_utils 是面向 ESP-IDF 生态的轻量级类型工具组件,专为嵌入式底层开发中高频出现的字节级数据操作与字符串格式化需求而设计。它并非 ESP-IDF 官方 SDK 的一部分,而是由开发者 Eric Gionet(K0I05)维护的开源…...
RT-Thread下STM32与BH1750光照传感器的快速驱动实现
1. RT-Thread与BH1750的完美组合 第一次接触BH1750光照传感器时,我还在用裸机开发。当时为了调试IIC通讯,整整花了两天时间排查时序问题。后来接触到RT-Thread,发现它的软件包生态简直是为传感器开发量身定制的。就拿BH1750来说,官…...
FPGA时序约束实战:Set_Clock_Sense的精准控制与路径优化
1. 为什么需要Set_Clock_Sense约束 在FPGA设计中,时钟网络就像城市交通系统中的红绿灯,控制着数据在各个寄存器之间的流动节奏。但实际工程中经常会遇到一些特殊场景:比如一个多路选择器(MUX)同时接收多个时钟源&#…...
2025年SQL2API平台深度评测:QuickAPI、dbapi与Magic API的实战应用指南
1. 2025年SQL2API平台的核心价值与应用场景 在数据爆炸的时代,企业每天产生的数据量呈指数级增长。我曾参与过一个零售企业的数据中台项目,他们的商品数据分散在5个不同系统的数据库中,光是整理基础数据接口就耗费了团队两周时间。直到我们引…...
如何免费使用Pyfa:EVE Online舰船配置终极实用指南
如何免费使用Pyfa:EVE Online舰船配置终极实用指南 【免费下载链接】Pyfa Python fitting assistant, cross-platform fitting tool for EVE Online 项目地址: https://gitcode.com/gh_mirrors/py/Pyfa Pyfa(Python Fitting Assistant)…...
