RocketMq的消息类型及代码案例
RocketMQ 提供了多种消息类型,以满足不同业务场景对 顺序性、事务性、时效性 的要求。其核心设计思想是通过解耦 “消息传递模式” 与 “业务逻辑”,实现高性能、高可靠的分布式通信。
一、主要类型包括
- 普通消息(基础类型)
- 顺序消息(保证消费顺序)
- 定时 / 延迟消息(控制投递时间)
- 事务消息(分布式事务最终一致性)
- 批量消息(提升吞吐量)
二、消息类型及代码示例
1. 普通消息(Normal Message)
描述:最基础的消息类型,支持异步发送、批量发送等模式,适用于无需严格顺序和事务保证的场景(如日志收集、通知推送)。
核心优势:高吞吐量、低延迟,生产端通过负载均衡自动选择 Broker。
import org.apache.rocketmq.client.apis.ClientConfiguration;
import org.apache.rocketmq.client.apis.ClientException;
import org.apache.rocketmq.client.apis.ClientServiceProvider;
import org.apache.rocketmq.client.apis.StaticSessionCredentialsProvider;
import org.apache.rocketmq.client.apis.message.Message;
import org.apache.rocketmq.client.apis.producer.Producer;
import org.apache.rocketmq.client.apis.producer.SendReceipt;public class NormalMessageExample {public static void main(String[] args) throws ClientException, InterruptedException {// 1. 加载服务提供者(支持SPI扩展)ClientServiceProvider provider = ClientServiceProvider.loadService();// 2. 配置认证信息(密钥管理)String accessKey = "yourAccessKey";String secretKey = "yourSecretKey";StaticSessionCredentialsProvider credentialsProvider =new StaticSessionCredentialsProvider(accessKey, secretKey);// 3. 构建客户端配置(支持多协议、TLS加密)ClientConfiguration clientConfiguration = ClientConfiguration.newBuilder().setEndpoints("localhost:8081") // 支持域名或IP:端口列表.setCredentialProvider(credentialsProvider).setRequestTimeout(Duration.ofSeconds(3)) // 请求超时时间.build();// 4. 创建生产者(支持自动重试、批量发送)String topic = "normal-message-topic";Producer producer = provider.newProducerBuilder().setClientConfiguration(clientConfiguration).setTopics(topic).setMaxAttempts(3) // 发送失败最大重试次数.build();// 5. 构建并发送消息Message message = provider.newMessageBuilder().setTopic(topic).setBody("Hello RocketMQ 5.0!".getBytes()).setTag("order") // 可选标签,用于消息过滤.setKeys("key123") // 消息业务键,用于查询.build();// 同步发送(阻塞当前线程直到返回结果)SendReceipt receipt = producer.send(message);System.out.println("消息发送成功: " + receipt.getMessageId());// 异步发送示例/*producer.sendAsync(message).thenAccept(sendReceipt -> {System.out.println("异步发送成功: " + sendReceipt.getMessageId());}).exceptionally(throwable -> {System.out.println("异步发送失败: " + throwable.getMessage());return null;});*/// 6. 关闭资源(重要!避免内存泄漏)producer.close();}
}
2. 顺序消息(Ordered Message)
描述:通过将同一业务主键的消息路由到相同队列,保证消息消费顺序与发送顺序一致。
应用场景:金融交易流水、订单状态变更、时序数据处理。
import org.apache.rocketmq.client.apis.ClientConfiguration;
import org.apache.rocketmq.client.apis.ClientException;
import org.apache.rocketmq.client.apis.ClientServiceProvider;
import org.apache.rocketmq.client.apis.message.Message;
import org.apache.rocketmq.client.apis.producer.Producer;
import org.apache.rocketmq.client.apis.producer.SendReceipt;import java.util.List;public class OrderedMessageExample {public static void main(String[] args) throws ClientException, InterruptedException {ClientServiceProvider provider = ClientServiceProvider.loadService();ClientConfiguration config = ClientConfiguration.newBuilder().setEndpoints("localhost:8081").build();String topic = "ordered-message-topic";Producer producer = provider.newProducerBuilder().setClientConfiguration(config).setTopics(topic).build();// 模拟订单状态变更(同一订单ID的消息必须顺序处理)String[] orderIds = {"order1001", "order1002", "order1001"};String[] orderStatus = {"CREATED", "PAYED", "SHIPPED"};for (int i = 0; i < orderIds.length; i++) {String orderId = orderIds[i];String status = orderStatus[i % orderStatus.length];// 关键:通过MessageGroup确保相同订单的消息发送到同一队列Message message = provider.newMessageBuilder().setTopic(topic).setBody(("订单[" + orderId + "]状态变更为: " + status).getBytes()).setMessageGroup(orderId) // 消息组决定消息路由的队列.setKeys(orderId) // 设置业务键便于查询.build();SendReceipt receipt = producer.send(message);System.out.println("发送顺序消息: " + receipt.getMessageId() + ", 订单ID: " + orderId + ", 状态: " + status);}producer.close();}
}
3. 定时 / 延迟消息(Scheduled/Delay Message)
描述:消息发送后,需等待指定时间(或到达指定时间点)才会被消费者可见。
应用场景:订单超时自动关闭、任务调度、延迟重试。
import org.apache.rocketmq.client.apis.ClientConfiguration;
import org.apache.rocketmq.client.apis.ClientException;
import org.apache.rocketmq.client.apis.ClientServiceProvider;
import org.apache.rocketmq.client.apis.message.Message;
import org.apache.rocketmq.client.apis.producer.Producer;
import org.apache.rocketmq.client.apis.producer.SendReceipt;import java.time.Duration;
import java.time.Instant;public class DelayMessageExample {public static void main(String[] args) throws ClientException, InterruptedException {ClientServiceProvider provider = ClientServiceProvider.loadService();ClientConfiguration config = ClientConfiguration.newBuilder().setEndpoints("localhost:8081").build();String topic = "delay-message-topic";Producer producer = provider.newProducerBuilder().setClientConfiguration(config).setTopics(topic).build();// 方式一:使用绝对时间戳(精确到毫秒)long timestamp = Instant.now().plus(Duration.ofMinutes(5)).toEpochMilli();Message messageByTimestamp = provider.newMessageBuilder().setTopic(topic).setBody("5分钟后执行的定时消息".getBytes()).setDeliveryTimestamp(timestamp) // 设置投递时间戳.build();// 方式二:使用预定义延迟级别(需Broker配置支持)Message messageByLevel = provider.newMessageBuilder().setTopic(topic).setBody("延迟30秒的消息".getBytes()).addProperty("DELAY", "3") // 假设3对应30秒(需Broker配置).build();// 发送延迟消息SendReceipt receipt = producer.send(messageByTimestamp);System.out.println("延迟消息发送成功: " + receipt.getMessageId() + ", 将于 " + Instant.ofEpochMilli(timestamp) + " 可见");producer.close();}
}
4. 事务消息(Transactional Message)
描述:
通过两阶段提交机制,保证本地事务与消息发送的最终一致性。
核心流程:
发送半消息(对消费者不可见)
- 执行本地事务
- 根据事务结果提交或回滚半消息
- 支持事务状态回查(处理超时情况)
import org.apache.rocketmq.client.apis.ClientConfiguration;
import org.apache.rocketmq.client.apis.ClientException;
import org.apache.rocketmq.client.apis.ClientServiceProvider;
import org.apache.rocketmq.client.apis.message.Message;
import org.apache.rocketmq.client.apis.producer.TransactionResolution;
import org.apache.rocketmq.client.apis.producer.TransactionalProducer;public class TransactionalMessageExample {public static void main(String[] args) throws ClientException, InterruptedException {ClientServiceProvider provider = ClientServiceProvider.loadService();ClientConfiguration config = ClientConfiguration.newBuilder().setEndpoints("localhost:8081").build();String topic = "transactional-message-topic";TransactionalProducer producer = provider.newTransactionalProducerBuilder().setClientConfiguration(config).setTopics(topic)// 关键:设置事务状态回查处理器(当Broker长时间未收到事务状态时触发).setTransactionChecker(messageView -> {System.out.println("回查事务状态: " + messageView.getBodyAsString());// 根据业务ID查询本地事务状态String bizId = messageView.getKeys().iterator().next();boolean transactionStatus = checkLocalTransactionStatus(bizId);return transactionStatus ? TransactionResolution.COMMIT : TransactionResolution.ROLLBACK;}).build();try {// 1. 开启事务上下文producer.beginTransaction();// 2. 发送半消息(未提交状态)Message message = provider.newMessageBuilder().setTopic(topic).setBody("用户账户扣款成功,通知库存系统扣减".getBytes()).setKeys("order_12345") // 设置业务键,用于回查.build();producer.send(message);// 3. 执行本地事务(如数据库操作)boolean localTransactionResult = executeLocalTransaction();// 4. 根据本地事务结果提交或回滚if (localTransactionResult) {producer.commit(); // 提交事务,消息对消费者可见System.out.println("本地事务执行成功,消息提交");} else {producer.rollback(); // 回滚事务,消息被丢弃System.out.println("本地事务执行失败,消息回滚");}} catch (Exception e) {producer.rollback(); // 异常时回滚e.printStackTrace();} finally {producer.close();}}private static boolean executeLocalTransaction() {// 模拟本地事务:如用户账户扣款System.out.println("执行本地事务...");return true; // 返回事务执行结果}private static boolean checkLocalTransactionStatus(String bizId) {// 模拟查询本地事务状态(如查询数据库订单状态)System.out.println("查询本地事务状态: " + bizId);return true; // 实际应根据业务ID查询真实状态}
}
5. 批量消息(Batch Message)
描述:将多条消息打包为一个批次发送,减少网络开销,提升吞吐量。
注意事项:
- 所有消息必须属于同一 Topic
- 总大小不能超过 4MB(默认限制,可配置)
- 不支持事务和延迟属性
import org.apache.rocketmq.client.apis.ClientConfiguration;
import org.apache.rocketmq.client.apis.ClientException;
import org.apache.rocketmq.client.apis.ClientServiceProvider;
import org.apache.rocketmq.client.apis.message.Message;
import org.apache.rocketmq.client.apis.producer.Producer;
import org.apache.rocketmq.client.apis.producer.SendReceipt;import java.util.ArrayList;
import java.util.List;public class BatchMessageExample {public static void main(String[] args) throws ClientException, InterruptedException {ClientServiceProvider provider = ClientServiceProvider.loadService();ClientConfiguration config = ClientConfiguration.newBuilder().setEndpoints("localhost:8081").build();String topic = "batch-message-topic";Producer producer = provider.newProducerBuilder().setClientConfiguration(config).setTopics(topic).build();// 创建批量消息集合List<Message> messages = new ArrayList<>();for (int i = 0; i < 100; i++) { // 示例:批量发送100条消息Message message = provider.newMessageBuilder().setTopic(topic).setBody(("批量消息-" + i).getBytes()).setKeys("key-" + i).build();messages.add(message);}// 智能拆分大批次(避免超过4MB限制)List<List<Message>> batches = splitMessages(messages);// 发送所有批次for (List<Message> batch : batches) {List<SendReceipt> receipts = producer.send(batch);System.out.println("批量发送成功,共" + receipts.size() + "条消息");}producer.close();}// 智能拆分大批次消息(实际生产中建议实现)private static List<List<Message>> splitMessages(List<Message> messages) {// 简单实现:实际应根据消息大小动态拆分List<List<Message>> result = new ArrayList<>();result.add(messages);return result;}
}
6. 消费者示例(通用)
描述:RocketMQ 5.0 支持 Push 和 Pull 两种消费模式,以下是基于长轮询的 PushConsumer 示例。
import org.apache.rocketmq.client.apis.ClientConfiguration;
import org.apache.rocketmq.client.apis.ClientException;
import org.apache.rocketmq.client.apis.ClientServiceProvider;
import org.apache.rocketmq.client.apis.consumer.ConsumeResult;
import org.apache.rocketmq.client.apis.consumer.FilterExpression;
import org.apache.rocketmq.client.apis.consumer.FilterExpressionType;
import org.apache.rocketmq.client.apis.consumer.PushConsumer;import java.time.Duration;public class ConsumerExample {public static void main(String[] args) throws ClientException, InterruptedException {ClientServiceProvider provider = ClientServiceProvider.loadService();ClientConfiguration config = ClientConfiguration.newBuilder().setEndpoints("localhost:8081").build();// 订阅主题和过滤表达式(支持SQL92语法)String topic = "normal-message-topic";FilterExpression filterExpression = new FilterExpression("TAG = 'order' AND age > 18", // 示例SQL过滤条件FilterExpressionType.SQL92);// 创建PushConsumer(基于长轮询的"伪推"模式)PushConsumer consumer = provider.newPushConsumerBuilder().setClientConfiguration(config).setConsumerGroup("my-consumer-group") // 消费组决定消息负载方式.setSubscriptionExpressions(Map.of(topic, filterExpression)).setMaxPollInterval(Duration.ofSeconds(30)) // 长轮询超时时间.setConsumptionThreadCount(10) // 消费线程数.setMessageListener(messageView -> {try {// 处理消息逻辑(业务代码)System.out.println("接收到消息: " + messageView.getBodyAsString());System.out.println("消息属性: " + messageView.getProperties());// 模拟业务处理耗时Thread.sleep(100);// 返回消费结果(成功/失败)return ConsumeResult.SUCCESS;} catch (Exception e) {// 消费失败时返回RETRY,消息将重试消费System.out.println("消息消费失败: " + e.getMessage());return ConsumeResult.FAILURE;}}).build();// 保持主线程运行,避免消费者立即关闭System.out.println("消费者已启动,按Ctrl+C退出...");Thread.sleep(Long.MAX_VALUE);}
}
关键依赖配置(Maven)
<dependencies><!-- RocketMQ 5.0 Java客户端 --><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client-java</artifactId><version>5.1.0</version></dependency><!-- gRPC依赖 --><dependency><groupId>io.grpc</groupId><artifactId>grpc-netty-shaded</artifactId><version>1.54.0</version></dependency><!-- 序列化依赖 --><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>3.21.9</version></dependency>
</dependencies>
三、最佳实践建议
-
连接配置:
- 生产环境建议使用域名而非 IP,支持动态扩容
- 开启 TLS 加密(通过
ClientConfiguration.setSslTrustStorePath
)
-
消息大小:
- 单条消息建议不超过 1MB
- 批量消息总大小不超过 4MB(可通过
producer.setMaxMessageSize
调整)
-
异常处理:
- 生产者需捕获
ClientException
并实现重试逻辑 - 消费者应避免长时间阻塞,建议使用异步处理
- 生产者需捕获
-
性能调优:
- 生产者:调整
sendMsgTimeout
和maxAttempts
参数 - 消费者:根据业务吞吐量调整
consumptionThreadCount
- 生产者:调整
-
监控告警:
- 监控 Topic 的 TPS、RT、堆积量等指标
- 配置告警阈值(如单队列堆积超过 10 万条)
四、总结
RocketMQ支持多种消息类型以满足不同业务需求:普通消息适用于高吞吐场景;顺序消息保证消费顺序;定时/延迟消息控制投递时间;事务消息确保分布式事务一致性;批量消息提升吞吐量。每种类型都提供了对应的Java代码示例,包括生产者配置、消息构建和发送逻辑。最佳实践建议包括合理配置连接、控制消息大小、完善异常处理、性能调优和监控告警。通过解耦消息传递与业务逻辑,RocketMQ实现了高性能、高可靠的分布式通信能力。
相关文章:
RocketMq的消息类型及代码案例
RocketMQ 提供了多种消息类型,以满足不同业务场景对 顺序性、事务性、时效性 的要求。其核心设计思想是通过解耦 “消息传递模式” 与 “业务逻辑”,实现高性能、高可靠的分布式通信。 一、主要类型包括 普通消息(基础类型)顺序…...
Eigen 直线拟合/曲线拟合/圆拟合/椭圆拟合
一、直线拟合 使用Eigen库进行直线拟合是数据分析和科学计算中的常见任务,主要通过最小二乘法实现。以下是关键实现方法和示例: 核心原理最小二乘法通过最小化点到直线距离的平方和来求解最优直线参数间接平差法是最小二乘法的具体实现形式,适用于直线拟合场景通过构建误差…...

安卓无障碍脚本开发全教程
文章目录 第一部分:无障碍服务基础1.1 无障碍服务概述核心功能: 1.2 基本原理与架构1.3 开发环境配置所需工具:关键依赖: 第二部分:创建基础无障碍服务2.1 服务声明配置2.2 服务配置文件关键属性说明: 2.3 …...
svn迁移到git保留记录和Python字符串格式化 f-string的进化历程
svn迁移到git保留记录 and Python字符串格式化(二): f-string的进化历程 在将项目从SVN迁移到Git时,保留完整的版本历史记录非常重要。下面是详细的步骤和工具,可以帮助你完成这一过程: 安装Git和SVN工具 首先&#…...

SOC-ESP32S3部分:10-GPIO中断按键中断实现
飞书文档https://x509p6c8to.feishu.cn/wiki/W4Wlw45P2izk5PkfXEaceMAunKg 学习了GPIO输入和输出功能后,参考示例工程,我们再来看看GPIO中断,IO中断的配置分为三步 配置中断触发类型安装中断服务注册中断回调函数 ESP32-S3的所有通用GPIO…...
【神经网络与深度学习】扩散模型之原理解释
引言: 在人工智能的生成领域,扩散模型(Diffusion Model)是一项极具突破性的技术。它不仅能够生成高质量的图像,还可以应用于音频、3D建模等领域。扩散模型的核心思想来源于物理扩散现象,其工作方式类似于从…...
语音合成之十六 语音合成(TTS)跳跃与重复问题的解析:成因、机制及解决方案
语音合成(TTS)跳跃与重复问题的解析:成因、机制及解决方案 引言TTS中跳跃与重复问题的根本原因注意力机制的失效文本到语音的对齐挑战自回归(AR)TTS模型的固有挑战时长建模的重要性输入数据特征的影响 构建鲁棒性&…...

战略-2.1 -战略分析(PEST/五力模型/成功关键因素)
战略分析路径,先宏观(PEST)、再产业(产品生命周期、五力模型、成功关键因素)、再竞争对手分析、最后企业内部分析。 本文介绍:PEST、产品生命周期、五力模型、成功关键因素、产业内的战略群组 一、宏观环境…...

python第三方库安装错位
问题所在 今天在安装我的django库时,我的库安装到了python3.13版本。我本意是想安装到python3.11版本的。我的pycharm右下角也设置了python3.11 但是太可恶了,我在pycharm的项目终端执行安装命令的时候还是给我安装到了python3.13的位置。 解决方法 我…...

如何把vue项目部署在nginx上
1:在vscode中把vue项目打包会出现dist文件夹 按照图示内容即可把vue项目部署在nginx上...

Vue3集成Element Plus完整指南:从安装到主题定制下-实现后台管理系统框架搭建
本文将详细介绍如何使用 Vue 3 构建一个综合管理系统,包括路由配置、页面布局以及常用组件集成。 一、路由配置 首先,我们来看系统的路由配置,这是整个应用的基础架构: import {createRouter, createWebHistory} from vue-rout…...

SpringBoot项目配置文件、yml配置文件
一. 配置文件格式 1. SpringBoot项目提供了多种属性配置方式(properties、yaml、yml)。 二. yml配置文件 1. 格式: (1) 数值前边必须有空格,作为分隔符。 (2) 使用缩进表示层级关系,缩进时,不允许使用Tab键,只能使用空…...
Linux性能监控:工具与最佳实践
引言 在Linux系统管理中,性能监控是确保系统健康运行的关键环节。无论是排查系统瓶颈、优化资源分配,还是预防潜在问题,有效的监控工具和技术都能为管理员提供宝贵的数据支持。本文将介绍Linux性能监控的核心工具、方法论和最佳实践。 一、…...

windows11 安装 jupyter lab
1、安装python环境 略 2、安装jupyterlab pip install jupyterlab 3、将jupyterlab的目录配置到path pip show jupyterlab 看到location的值,那么 jupyterlab就安装在与之同级的Scripts下,将Scripts目录设置在Path即可。...

【算法】:动态规划--背包问题
背包问题 引言 什么是背包问题? 背包问题就是一个有限的背包,给出一定的物品,如何合理的装入物品使得背包中的物品的价值最大? 01背包 01背包,顾名思义就是每一种给定的物品要么选择,要么不选ÿ…...

Nginx核心功能
目录 前言一. 正向代理1.配置正向代理(1)添加正向代理(2)验证正向代理 二. 反向代理1.配置nginx七层代理(1)环境安装(2)配置nginx七层代理转发(3)测试 2. 配置…...
AG-UI:重构AI代理与前端交互的下一代协议标准
目录 技术演进背景与核心价值协议架构与技术原理深度解析核心功能与标准化事件体系典型应用场景与实战案例开发者生态与集成指南行业影响与未来展望1. 技术演进背景与核心价值 1.1 AI交互的三大痛点 当前AI应用生态面临三大核心挑战: 交互碎片化:LangGraph、CrewAI等框架各…...

upload-labs通关笔记-第15关 文件上传之图片马getimagesize绕过
系列目录 upload-labs通关笔记-第1关 文件上传之前端绕过(3种渗透方法) upload-labs通关笔记-第2关 文件上传之MIME绕过-CSDN博客 upload-labs通关笔记-第3关 文件上传之黑名单绕过-CSDN博客 upload-labs通关笔记-第4关 文件上传之.htacess绕过-CSDN…...
FFmpeg中使用Android Content协议打开文件设备
引言 随着Android 10引入的Scoped Storage(分区存储)机制,传统的文件访问方式发生了重大变化。FFmpeg作为强大的多媒体处理工具,也在不断适应Android平台的演进。本文将介绍如何在FFmpeg 7.0版本中使用Android content协议直接访…...
SQL语句的执行流程
文章目录 一、执行流程二、建立连接三、预处理器四、解析器4.1 词法分析4.2 语法分析4.3 语义分析 五、优化器六、执行器七、返回结果 一、执行流程 阶段主要功能关键组件1. 建立连接身份验证、权限检查连接器2. 预处理器缓存检查、SQL预处理查询缓存3. 解析器词法分析、语法分…...
Spring 框架的JDBC 模板技术
一、JDBC 模板技术概述 1、什么模板技术? Spring 框架中提供了很多持久层的模板类来简化编程,使用模板类编写程序会变的简单。 2、template 模板 都是 Spring 框架来提供XxxTemplate,比如Spring框架提供了 JDBC 模板。 JdbcTemplate 类&…...

【游戏设计】游戏玩法与游戏机制
在游戏设计中,“玩法”(Gameplay)和“机制”(Game Mechanic)是两个频繁出现但容易混淆的概念。许多新手开发者、设计师甚至玩家常常将两者混为一谈。本文将通过定义、对比和案例解析的方式,清晰地阐明二者的…...

Spring的资源Resource和ResourceLoader
两者区别和联系 Resource 和ResourceLoader 都是 Spring 框架中用于资源访问的接口 Resource 是“资源本身”,ResourceLoader 是“资源工厂/加载器”,负责创建 Resource。 Resource:Spring 统一抽象的“资源”对象,可以表示文件、类路径下的文件、U…...
字节跳动旗下火山引擎都覆盖哪些领域
首先,我需要确认火山引擎的主要业务范围。根据之前的资料,火山引擎是字节跳动的企业技术服务平台,可能包括云服务、人工智能、大数据分析等。不过需要更详细的信息,比如具体的产品和服务,覆盖的行业等。 接下来&#x…...

【AI实战】从“苦AI”到“爽AI”:Magentic-UI 把“人类-多智能体协作”玩明白了!
Hello,亲爱的小伙伴们!你是否曾经在深夜里,为了自动化点外卖、筛机票、抓网页数据焦头烂额?有没有幻想过哪天能出个“贴心AI管家”,一键点菜、搞定事务、自动操作网页,比你还懂你?更关键——还让…...
LeetCode面试经典150题梳理
link:https://leetcode.cn/studyplan/top-interview-150/ 日期题号备注2025.5.2288. 合并两个有序数组 - 力扣(LeetCode)通过双指针法从后向前合并来解决,避免覆盖nums1中的元素2025.5.2327. 移除元素 - 力扣(LeetCode…...
ABP VNext + Orleans:Actor 模型下的分布式状态管理最佳实践
ABP VNext Orleans:Actor 模型下的分布式状态管理最佳实践 🚀 📚 目录 ABP VNext Orleans:Actor 模型下的分布式状态管理最佳实践 🚀一、引言:分布式系统的状态挑战 💡二、架构图与技术栈 &am…...

Linux之 SPI 驱动框架- spi-mem 框架
一、框架变更的历程 1.1 旧框架图 1.2 新框架图 那么问题来了, 为什么要开发新的 SPI 存储器接口? 有了这个新的框架, SPI NOR 和SPI NAND 都可以基于相同的SPI控制器驱动进行支持了。m25p80 驱动将被修改成,使用spi-mem 接口&a…...

振动分析 - 献个宝
1.一个自制的振动能量分析工具 这个分析工具似乎真的定位到了故障的具体位置。 1.1对一组实验室虚拟信号的分析结果: 1.2 对现场真实数据的分析结果 依照边频带的调制,和边频的缝隙宽度,基本定位到问题。 追加几份待看的文档: 齿轮结构的频谱特征 - 知乎使用 FFT 获得…...
从脑电图和大脑记录中学习稳健的深度视觉表征
从脑电图和大脑记录中学习稳健的深度视觉表征 印度,印度,印度,印度大脑实验室,印度 例如,达拉普,克普拉萨德,山,山,新的。ac .在 摘要 解码人类大脑一直是新机器人科学家…...