RabbitMQ(四种使用模式)
文章目录
- 1.Fanout(广播模式)
- 1.基本介绍
- 2.需求分析
- 3.具体实现
- 1.编写配置类 RabbitMQConfig.java
- 2.编写生产者,发送消息到交换机 MQSender.java
- 3.编写消费者,接受消息 MQReceiver.java
- 4.控制层调用方法,发送信息到交换机
- 4.启动测试
- 1.访问查看IDEA控制台输出
- 1.访问 http://localhost:9092/seckill/mq/exchange
- 2.查看控制台输出,两个队列同时接受到了消息
- 2.访问RabbitMQ控制台 http://ip:15672
- 1.查看交换机是否绑定了两个队列
- 2.再查看Queues,新增了两个队列
- 2.Direct(路由模式)
- 1.基本介绍
- 2.需求分析
- 3.具体实现
- 1.配置类 RabbitMQConfig.java
- 2.编写生产者,发送消息到交换机并指定路由 MQSender.java
- 3.编写消费者,接受消息 MQReceiver.java
- 4.控制层调用方法,发送信息到交换机
- 4.启动测试
- 1.访问查看IDEA控制台输出
- 1.访问 http://localhost:9092/seckill/mq/direct/green
- 2.访问 http://localhost:9092/seckill/mq/direct/red
- 2.访问RabbitMQ控制台 http://140.143.164.206:15672
- 1.交换机绑定了两个队列
- 2.再查看Queues,新增了两个队列
- 3.Topic(主题模式)
- 1.基本介绍
- 1.介绍
- 2.关于匹配模式的说明
- 2.需求分析
- 3.具体实现
- 1.配置类 RabbitMQConfig.java
- 2.编写生产者,发送消息到交换机并指定路由 MQSender.java
- 3.编写消费者,接受消息 MQReceiver.java
- 4.控制层调用方法,发送信息到交换机
- 4.启动测试
- 1.示意图
- 2.访问查看IDEA控制台输出
- 1.访问 http://localhost:9092/seckill/mq/topic/one.orange.one 匹配Q1
- 2.访问 http://localhost:9092/seckill/mq/topic/one.one.rabbit 匹配Q2
- 3.访问 http://localhost:9092/seckill/mq/topic/lazy.orange.one 匹配Q1和Q2
- 4.访问 http://localhost:9092/seckill/mq/topic/lazy.any.any.any.any 匹配Q2
- 4.Headers(头路由模式,使用较少)
- 1.基本介绍
- 2.示意图
- 3.需求分析
- 4.具体实现
- 1.配置类 RabbitMQConfig.java
- 2.编写生产者,发送消息到交换机并指定路由 MQSender.java
- 3.编写消费者,接受消息 MQReceiver.java
- 4.控制层调用方法,发送信息到交换机
- 5.启动测试
- 1.访问查看IDEA控制台输出
- 1.访问 http://localhost:9092/seckill/mq/headers 匹配队列一
- 2.访问 http://localhost:9092/seckill/mq/headers2 匹配队列二
- 5.RabbitMQ使用模式总结
- 1.整体架构图
- 2.通用使用方式
- 1.编写RabbitMQ的配置类
- 2.编写消息发送者
- 3.编写消息接受者
- 4.编写控制层
1.Fanout(广播模式)
1.基本介绍

2.需求分析

3.具体实现
1.编写配置类 RabbitMQConfig.java
// 定义一个交换机,两个队列的名称private static final String EXCHANGE = "exchange";private static final String QUEUE1 = "queue1";private static final String QUEUE2 = "queue2";// 创建两个队列和一个交换机// 创建队列1@Beanpublic Queue queue1() {return new Queue(QUEUE1, true);}// 创建队列2@Beanpublic Queue queue2() {return new Queue(QUEUE2, true);}// 创建交换机@Beanpublic FanoutExchange exchange() {return new FanoutExchange(EXCHANGE);}// 将队列一和交换机绑定@Beanpublic Binding binding1() {return BindingBuilder.bind(queue1()).to(exchange());}// 将队列二和交换机绑定@Beanpublic Binding binding2() {return BindingBuilder.bind(queue2()).to(exchange());}
2.编写生产者,发送消息到交换机 MQSender.java
// 发送消息到交换机public void sendExchange(Object message) {log.info("发送消息到交换机: " + message);// 发送消息到交换机,需要指定在配置类中配置的交换机名,这里的空字符串表示忽略路由键rabbitTemplate.convertAndSend("exchange", "", message);}
3.编写消费者,接受消息 MQReceiver.java
// 两个队列从交换机接受消息@RabbitListener(queues = "queue1")public void receive1(Object message) {log.info("queue1接收消息: " + message);}// 两个队列从交换机接受消息@RabbitListener(queues = "queue2")public void receive2(Object message) {log.info("queue2接收消息: " + message);}
4.控制层调用方法,发送信息到交换机
// 发送信息到交换机@RequestMapping("/mq/exchange")@ResponseBodypublic void mqExchange() {mqSender.sendExchange("hello rabbitmq exchange");}
4.启动测试
1.访问查看IDEA控制台输出
1.访问 http://localhost:9092/seckill/mq/exchange

2.查看控制台输出,两个队列同时接受到了消息

2.访问RabbitMQ控制台 http://ip:15672
1.查看交换机是否绑定了两个队列


2.再查看Queues,新增了两个队列

2.Direct(路由模式)
1.基本介绍

2.需求分析

3.具体实现
1.配置类 RabbitMQConfig.java
// ----------------- Direct模式 -----------------// 定义一个交换机,两个队列的名称private static final String DIRECT_EXCHANGE = "directExchange";private static final String DIRECT_QUEUE1 = "directQueue1";private static final String DIRECT_QUEUE2 = "directQueue2";// 定义两个路由分别为red和greenpublic static final String RED = "red";public static final String GREEN = "green";// 创建两个队列和一个交换机// 创建队列1@Beanpublic Queue directQueue1() {return new Queue(DIRECT_QUEUE1, true);}// 创建队列2@Beanpublic Queue directQueue2() {return new Queue(DIRECT_QUEUE2, true);}// 创建Direct交换机@Beanpublic DirectExchange directExchange() {return new DirectExchange(DIRECT_EXCHANGE);}// 将队列一和交换机绑定,并指定路由为red@Beanpublic Binding directBinding1() {return BindingBuilder.bind(directQueue1()).to(directExchange()).with(RED);}// 将队列二和交换机绑定,并指定路由为green@Beanpublic Binding directBinding2() {return BindingBuilder.bind(directQueue2()).to(directExchange()).with(GREEN);}// ----------------- Direct模式 -----------------
2.编写生产者,发送消息到交换机并指定路由 MQSender.java
// ----------------- Direct模式 -----------------// 发送消息到Direct交换机,指定路由键public void sendDirect(Object message, String routingKey) {log.info("发送消息到Direct交换机: " + message);// 发送消息到交换机,需要指定在配置类中配置的交换机名,这里的路由键为 routingKeyrabbitTemplate.convertAndSend("directExchange", routingKey, message);}// ----------------- Direct模式 -----------------
3.编写消费者,接受消息 MQReceiver.java
// ----------------- Direct模式 -----------------// directQueue1接收消息@RabbitListener(queues = "directQueue1")public void receiveDirect(Object message) {log.info("directQueue1接收消息: " + message);}// directQueue2接收消息@RabbitListener(queues = "directQueue2")public void receiveDirect2(Object message) {log.info("directQueue2接收消息: " + message);}// ----------------- Direct模式 -----------------
4.控制层调用方法,发送信息到交换机
// ----------------- Direct模式 -----------------// 发送消息到Direct交换机,指定路由键@RequestMapping("/mq/direct/{routingKey}")@ResponseBodypublic void mqDirect(@PathVariable String routingKey) {mqSender.sendDirect("hello rabbitmq direct", routingKey);}// ----------------- Direct模式 -----------------
4.启动测试
1.访问查看IDEA控制台输出
1.访问 http://localhost:9092/seckill/mq/direct/green

2.访问 http://localhost:9092/seckill/mq/direct/red

2.访问RabbitMQ控制台 http://140.143.164.206:15672
1.交换机绑定了两个队列


2.再查看Queues,新增了两个队列

3.Topic(主题模式)
1.基本介绍
1.介绍

2.关于匹配模式的说明
- 星号:可以匹配一个单词
- 井号:可以匹配零个或多个单词
2.需求分析

3.具体实现
1.配置类 RabbitMQConfig.java
// ----------------- Topic模式 -----------------// 定义一个交换机,两个队列的名称private static final String TOPIC_EXCHANGE = "topicExchange";private static final String TOPIC_QUEUE1 = "topicQueue1";private static final String TOPIC_QUEUE2 = "topicQueue2";// 定义三个路由public static final String ROUTING_KEY1 = "*.orange.*";public static final String ROUTING_KEY2 = "*.*.rabbit";public static final String ROUTING_KEY3 = "lazy.#";// 创建两个队列和一个交换机// 创建队列1@Beanpublic Queue topicQueue1() {return new Queue(TOPIC_QUEUE1, true);}// 创建队列2@Beanpublic Queue topicQueue2() {return new Queue(TOPIC_QUEUE2, true);}// 创建Topic交换机@Beanpublic TopicExchange topicExchange() {return new TopicExchange(TOPIC_EXCHANGE);}// 将队列一和交换机绑定,并指定路由为*.orange.*@Beanpublic Binding topicBinding1() {return BindingBuilder.bind(topicQueue1()).to(topicExchange()).with(ROUTING_KEY1);}// 将队列二和交换机绑定,并指定路由为*.*.rabbit和lazy.#@Beanpublic Binding topicBinding2() {return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with(ROUTING_KEY2);}@Beanpublic Binding topicBinding3() {return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with(ROUTING_KEY3);}// ----------------- Topic模式 -----------------
2.编写生产者,发送消息到交换机并指定路由 MQSender.java
// ----------------- Topic模式 -----------------// 发送消息到Topic交换机,指定路由键public void sendTopic(Object message, String routingKey) {log.info("发送消息到Topic交换机: " + message);// 发送消息到交换机,需要指定在配置类中配置的交换机名,这里的路由键为 routingKeyrabbitTemplate.convertAndSend("topicExchange", routingKey, message);}// ----------------- Topic模式 -----------------
3.编写消费者,接受消息 MQReceiver.java
// ----------------- Topic模式 -----------------// topicQueue1接收消息@RabbitListener(queues = "topicQueue1")public void receiveTopic1(Object message) {log.info("topicQueue1接收消息: " + message);}// topicQueue2接收消息@RabbitListener(queues = "topicQueue2")public void receiveTopic2(Object message) {log.info("topicQueue2接收消息: " + message);}// ----------------- Topic模式 -----------------
4.控制层调用方法,发送信息到交换机
// ----------------- Topic模式 -----------------// 发送消息到Topic交换机,指定路由键@RequestMapping("/mq/topic/{routingKey}")@ResponseBodypublic void mqTopic(@PathVariable String routingKey) {mqSender.sendTopic("hello rabbitmq topic", routingKey);}// ----------------- Topic模式 -----------------
4.启动测试
1.示意图

2.访问查看IDEA控制台输出
1.访问 http://localhost:9092/seckill/mq/topic/one.orange.one 匹配Q1

2.访问 http://localhost:9092/seckill/mq/topic/one.one.rabbit 匹配Q2

3.访问 http://localhost:9092/seckill/mq/topic/lazy.orange.one 匹配Q1和Q2

4.访问 http://localhost:9092/seckill/mq/topic/lazy.any.any.any.any 匹配Q2

4.Headers(头路由模式,使用较少)
1.基本介绍

2.示意图

3.需求分析

4.具体实现
1.配置类 RabbitMQConfig.java
// ----------------- Headers模式 -----------------// 定义一个交换机,两个队列的名称private static final String HEADERS_EXCHANGE = "headersExchange";private static final String HEADERS_QUEUE1 = "headersQueue1";private static final String HEADERS_QUEUE2 = "headersQueue2";// 创建两个队列和一个交换机// 创建队列1@Beanpublic Queue headersQueue1() {return new Queue(HEADERS_QUEUE1, true);}// 创建队列2@Beanpublic Queue headersQueue2() {return new Queue(HEADERS_QUEUE2, true);}// 创建Headers交换机@Beanpublic HeadersExchange headersExchange() {return new HeadersExchange(HEADERS_EXCHANGE);}// 将队列一和交换机绑定,并指定key-value,使用any表示只要有一个匹配就可以@Beanpublic Binding headersBinding1() {Map<String, Object> map = new HashMap<>();map.put("key1", "value1");map.put("key2", "value2");return BindingBuilder.bind(headersQueue1()).to(headersExchange()).whereAny(map).match();}// 将队列二和交换机绑定,并指定key-value,使用all表示所有的key-value都要匹配@Beanpublic Binding headersBinding2() {Map<String, Object> map = new HashMap<>();map.put("key3", "value3");map.put("key4", "value4");return BindingBuilder.bind(headersQueue2()).to(headersExchange()).whereAll(map).match();}// ----------------- Headers模式 -----------------
2.编写生产者,发送消息到交换机并指定路由 MQSender.java
// ----------------- Headers模式 -----------------// 发送消息到Headers交换机,匹配队列一public void sendHeaders(Object message) {log.info("发送消息到Headers交换机: " + message);// 发送消息到交换机,需要指定在配置类中配置的交换机名,这里的空字符串表示忽略路由键rabbitTemplate.convertAndSend("headersExchange", "", message, message1 -> {message1.getMessageProperties().getHeaders().put("key1", "value1");return message1;});}// 发送消息到Headers交换机,匹配队列二public void sendHeaders2(Object message) {log.info("发送消息到Headers交换机: " + message);// 发送消息到交换机,需要指定在配置类中配置的交换机名,这里的空字符串表示忽略路由键rabbitTemplate.convertAndSend("headersExchange", "", message, message1 -> {message1.getMessageProperties().getHeaders().put("key3", "value3");message1.getMessageProperties().getHeaders().put("key4", "value4");return message1;});}// ----------------- Headers模式 -----------------
3.编写消费者,接受消息 MQReceiver.java
// ----------------- Headers模式 -----------------// headersQueue1接收消息@RabbitListener(queues = "headersQueue1")public void receiveHeaders1(Object message) {log.info("headersQueue1接收消息: " + message);}// headersQueue2接收消息@RabbitListener(queues = "headersQueue2")public void receiveHeaders2(Object message) {log.info("headersQueue2接收消息: " + message);}// ----------------- Headers模式 -----------------
4.控制层调用方法,发送信息到交换机
// ----------------- Headers模式 -----------------// 发送消息到Headers交换机,匹配队列一@RequestMapping("/mq/headers")@ResponseBodypublic void mqHeaders() {mqSender.sendHeaders("hello rabbitmq headers");}// 发送消息到Headers交换机,匹配队列二@RequestMapping("/mq/headers2")@ResponseBodypublic void mqHeaders2() {mqSender.sendHeaders2("hello rabbitmq headers2");}// ----------------- Headers模式 -----------------
5.启动测试
1.访问查看IDEA控制台输出
1.访问 http://localhost:9092/seckill/mq/headers 匹配队列一

2.访问 http://localhost:9092/seckill/mq/headers2 匹配队列二

5.RabbitMQ使用模式总结
1.整体架构图

2.通用使用方式
1.编写RabbitMQ的配置类
- 创建交换机和队列
- 将队列分别与交换机按照具体标识绑定
2.编写消息发送者
- 指定交换机
- 携带消息和具体队列标识
3.编写消息接受者
- 只需要监听队列,接收消息即可
4.编写控制层
- 调用消息发送者,向交换机发送请求
相关文章:
RabbitMQ(四种使用模式)
文章目录 1.Fanout(广播模式)1.基本介绍2.需求分析3.具体实现1.编写配置类 RabbitMQConfig.java2.编写生产者,发送消息到交换机 MQSender.java3.编写消费者,接受消息 MQReceiver.java4.控制层调用方法,发送信息到交换机…...
【UE5 C++】基础学习笔记——01 UObject的创建与使用
目录 步骤 一、创建UObject 二、创建基于UObject的蓝图类 三、在UObject中使用变量和函数 步骤 一、创建UObject 在内容浏览器中新建一个C类 父类选择“Object” 类的类型设置为公有,这里就命名为“MyObject”,点击“创建类”来创建头文件和源文…...
TCP及IP协议
TCP协议的传输是可靠的,而UDP协议的传输“尽力而为” TCP传输可靠性———确认,重传,排序,流控。 流控:滑动窗口机制 TTL--- 数据包每经过一个路由器的转发,他的TTL值将减1,当一个数据包中的T…...
运筹系列92:vrp算法包VROOM
1. 介绍 VROOM is an open-source optimization engine written in C20 that aim at providing good solutions to various real-life vehicle routing problems (VRP) within a small computing time. 可以解决如下问题: TSP (travelling salesman problem) CVRP …...
【Spring Security注解详解】
Spring Security 是一个强大的、高度可定制的身份验证和访问控制框架,广泛用于Java应用程序中以确保安全。它提供了多种注解来简化安全控制的实现,特别是在方法级别的权限控制上。以下是几个核心的Spring Security注解及其用途的详细介绍: 1…...
C++学习笔记3
A. 求出那个数 题目描述 喵喵是一个爱睡懒觉的姑娘,所以每天早上喵喵的妈妈都花费很大的力气才能把喵喵叫起来去上学。 在放学的路上,喵喵看到有一家店在打折卖闹钟,她就准备买个闹钟回家叫自己早晨起床,以便不让妈妈这么的辛苦…...
基于SpringBoot的酒店(预约)客房管理系统的设计与实现+毕业论文
系统介绍 酒店客房管理系统为酒店管理者和用户、清洁人员提供一个在线管理酒店客房的系统。在网站的设计中,一共分为了两个模块设计,一个是前台模块,一个是后台模块,前台主要用于提供查看客房信息,酒店资讯࿰…...
Rust 中的声明可见性
Rust 中的声明可见性 在 Rust 编程语言中,声明可见性是一个核心概念,它决定了代码中的项(如函数、结构体、枚举等)在哪些范围内可以被访问。Rust 通过一套严谨的规则来控制这些可见性,以确保代码的安全性和封装性。下…...
让 计算机 将 数学 公式 表达式 的计算过程绘制出来 【mathematical-expression(MAE)】
目录 文章目录 目录介绍开始实战引入数学表达式计算库引入流程图代码生成库开始进行生成 介绍 大家好 今天我们来分享一个新知识,将数学表达式的整个计算过程,以及计算繁多结果在 Java 中绘制出来,计算机中的数学表达式计算的功能很常见了&a…...
Django——中间件
Django——中间件 中间件可以介入 Django 的请求和响应的处理过程,修改 Django 的响应数据。中间件的设计为程序开发者提供了一种无侵入式的开发方式,增强 Django 框架的健壮性。 中间件可以在 Django 处理视图的不同阶段的干预。 Django 框架中原先内…...
景联文科技:用高质量数据采集标注赋能无人机技术,引领无人机迈入新纪元!
随着无人机技术的不断发展与革新,它已成为现代社会中一个前景无限的科技领域。 无人机应用领域 边境巡逻与安防:边境管理部门利用无人机监控边境线,防止非法越境和其他安全威胁,同时也能监控地面安保人员的工作状态和行动路线。 …...
SpringBoot集成Redis,使用RedisTemple存储对象使用纯JSON格式
SpringBoot集成Redis,使用RedisTemple存储对象使用纯JSON格式 1、对象使用Json序列化 import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.ParserConfig; import com.alibaba.fastjson.serializer.SerializerFeature; import org.springframework.data.r…...
[muduo网络库]——muduo库的Reactor模型(剖析muduo网络库核心部分、设计思想)
一、前言 在学习 C 服务端的过程中,必不可少的一项就是熟悉一个网络库,包括网络库的应用和其底层实现。我们熟知的网络库有 libevent、libev、muduo、Netty 等,其中 muduo 是由陈硕大佬个人开发的 TCP 网络库,最近跟着课程正在深…...
vue中怎样清除computed的缓存
vue中computed计算属性自带缓存,会提高程序的渲染性能,但根据业务需求以及相应的优化,可能要清除computed的缓存,具体方法和场景分为了vue2和vue3 vue2: this.$delete(this.someObject, cachedProperty); 使用 this…...
代码大师的工具箱:现代软件开发利器
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
整理好了!2024年最常见 100 道 Java基础面试题(四十三)
上一篇地址:整理好了!2024年最常见 100 道 Java基础面试题(四十二)-CSDN博客 八十五、Java 常用的元注解有哪些? 在Java中,元注解(Meta-Annotation)是指那些用于其他注解上的注解&…...
【TypeScript模块简介以及使用方法】
TypeScript模块简介 TypeScript中的模块(Modules)是代码的封装体,它们可以包含变量、函数、类和接口等。在TypeScript中,模块可以被其他模块引用和使用,从而实现代码的复用和模块化开发。 TypeScript支持两种模块系统…...
Offer必备算法38_贪心算法四_八道力扣题详解(由易到难)
目录 ①力扣56. 合并区间 解析代码 ②力扣435. 无重叠区间 解析代码 ③力扣452. 用最少数量的箭引爆气球 解析代码 ④力扣397. 整数替换 解析代码1_递归改记忆化搜索 解析代码2_贪心策略 ⑤力扣354. 俄罗斯套娃信封问题 解析代码1_动态规划(超时…...
java8 转对象,Java8转Map,Java8转Llist
1.准备数据 public static List<Persion> getData(){List<Persion> arrayList new ArrayList<>();arrayList.add(new Persion("李四","20","男"));arrayList.add(new Persion("王麻子","30","男&q…...
【Pytest官方文档翻译及学习】2.1 如何调用pytest
目录 2.1 如何调用pytest 2.1.1 指定要运行的测试 2.1.2 获取有关版本、选项名称、环境变量的帮助 2.1.3 分析测试执行时间 2.1.4 管理加载插件 2.1.5 调用pytest的其他方式 2.1 如何调用pytest 2.1.1 指定要运行的测试 Pytest支持几种从命令行运行和选择测试的方法。、…...
未来企业不是“AI 工具型企业“——是 AI 驱动型企业
关于 AI 驱动型企业的一份构想 一、如果让你从零设计一家公司的技术栈 如果让你从头设计一家公司的技术栈,把 AI 当成核心组件——你会怎么搭? 不是"给现有系统加个 AI 调用",而是:流程怎么设计、岗位怎么抽象、内部系…...
别再被Word折磨了!百考通AI让你像“玩填空”一样搞定本科论文
论文写作不再是一座孤岛,而是一次有条不紊的旅程 又到了一年毕业季,朋友圈里开始交替出现两种状态:一种是晒答辩通过、手捧鲜花与导师合影的“上岸”喜讯,另一种则是深夜凌晨发出的、配着空白 Word 文档截图的“崩溃文学”。 “开…...
如何让GBFR-Logs成为你的碧蓝幻想Relink战斗分析利器
如何让GBFR-Logs成为你的碧蓝幻想Relink战斗分析利器 【免费下载链接】gbfr-logs GBFR Logs lets you track damage statistics with a nice overlay DPS meter for Granblue Fantasy: Relink. 项目地址: https://gitcode.com/gh_mirrors/gb/gbfr-logs 你是否在《碧蓝幻…...
STM32MP135异构核心板在充电桩主控中的设计与实践
1. 项目概述:当充电桩遇上高性能嵌入式核心板最近和几个做充电桩方案的朋友聊天,发现一个挺有意思的趋势:以前大家做充电桩主控,要么用传统的工控机,要么用一些通用MCU加一堆外围芯片来凑,方案复杂不说&…...
从 BGE 到 Qwen3:中文 RAG Reranker 模型解析
在 RAG 系统中,Reranker 往往是决定最终检索质量的关键一环,却也是最容易被忽视的模块。本文从 Reranker 的基本原理出发,介绍 Reranker Encoder 和 Decoder 两类架构的工作机制,随后解析目前中文场景下最主流的两大模型系列BGE-R…...
MPC-HC播放器:3步打造你的专属影院级视听体验
MPC-HC播放器:3步打造你的专属影院级视听体验 【免费下载链接】mpc-hc MPC-HCs main repository. For support use our Trac: https://trac.mpc-hc.org/ 项目地址: https://gitcode.com/gh_mirrors/mpc/mpc-hc MPC-HC(Media Player Classic Home …...
UE5 产品三维交互展示 创意实现
1. UE5产品三维交互展示的核心价值 想象一下,你正在向客户展示一款全新的无人机产品。传统的二维图片和视频已经无法满足需求,客户希望全方位了解产品细节,甚至能亲手"拆解"查看内部构造。这正是UE5三维交互展示的用武之地。 UE5…...
如何快速构建工业通信系统:SECS4Net的完整实战指南
如何快速构建工业通信系统:SECS4Net的完整实战指南 【免费下载链接】secs4net SECS-II/HSMS-SS/GEM implementation on .NET 项目地址: https://gitcode.com/gh_mirrors/se/secs4net SECS4Net是一个基于.NET平台的开源库,完整实现了SEMI标准的SEC…...
ARM9E-S内存接口与中断机制深度解析
1. ARM9E-S内存接口架构解析 ARM9E-S处理器的内存接口采用高度流水线化设计,这种架构通过预广播机制显著提升了内存访问效率。在实际工程应用中,理解这一设计原理对构建高性能嵌入式系统至关重要。 1.1 流水线化数据接口工作原理 内存接口的流水线化体…...
GEO优化实操框架:GEO优化的正确姿势是“带着答案去找客户”
如果你是B2B企业的老板或市场负责人,你一定听过这句话: “我们网上曝光是不少,但来的询盘都不对——问价格的比问方案的还多,还有不少是学生做调研的。” 这不是你一个人遇到的问题。这是传统SEO和竞价广告的天然缺陷——你只能“…...
