当前位置: 首页 > news >正文

利用Redisson分布式锁解决多服务器数据刷新问题

利用Redisson分布式锁解决多服务器数据刷新问题

  • 一、业务背景
  • 二、代码实现
    • 1、引入Redisson依赖
    • 2、配置Redisson,实际项目中Redis为集群配置
    • 3、自定义拒绝策略
    • 4、异步刷新网元服务
  • 三、项目结构及源码

一、业务背景

最近有个需求需要自动刷新网元服务,由于我们生产环境数据库是多台服务器,刷新网元可能导致的数据不一致问题‌,所以采用Redisson分布式锁方式实现这个业务功能。

二、代码实现

1、引入Redisson依赖

        <!-- redis --><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>2.7.5</version></dependency><!-- redisson --><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.16.0</version></dependency>

2、配置Redisson,实际项目中Redis为集群配置

@Configuration
public class RedisssionConfig {@Value("${spring.redis.password}")private String password;@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private String port;/*** 对 Redisson 的使用都是通过 RedissonClient 对象** @return*/@Bean(name = "redissonClient", destroyMethod = "shutdown") // 服务停止后调用 shutdown 方法public RedissonClient redissonClient() {// 1、创建配置Config config = new Config();// 2、集群模式// config.useClusterServers().addNodeAddress("127.0.0.1:7004", "127.0.0.1:7001");// 根据 Config 创建出 RedissonClient 示例config.useSingleServer().setPassword(StringUtils.isEmpty(password) ? null : password).setAddress(host.contains("://") ? "" : "redis://" + host + ":" + port);return Redisson.create(config);}
}

3、自定义拒绝策略

@Component
public class RefreshNodeRejectHandler implements RejectedExecutionHandler {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {// 拒绝将任务保存起来if (!executor.isShutdown()) {saveRejectedTask(r);}}class TaskInfo implements Runnable {private final List<NodeVo> nodeVos;TaskInfo(List<NodeVo> nodeVos) {this.nodeVos = nodeVos;}@Overridepublic void run() {System.out.println("执行了TaskInfo的run方法,执行了某某业务逻辑");}public List<NodeVo> getNodeVos() {return nodeVos;}}private void saveRejectedTask(Runnable r) {if (r instanceof TaskInfo) {TaskInfo taskInfo = (TaskInfo) r;List<NodeVo> nodeVos = taskInfo.getNodeVos();for (NodeVo node : nodeVos) {System.out.println("保存了被拒绝的任务:" + node);}}}
}

4、异步刷新网元服务

@Service
public class AsynFleshNodeService implements ApplicationRunner {private ThreadPoolExecutor threadPoolExecutor;@Autowiredprivate RefreshNodeRejectHandler refreshNodeRejectHandler;@Autowiredprivate RedissonClient redissionClient;@Autowiredprivate NodeMapper nodeMapper;@Overridepublic void run(ApplicationArguments args) throws Exception {ThreadPoolExecutor singleThreadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<>(1000));singleThreadPoolExecutor.execute(this::initTask);}private void initTask() {if (!openFleshNode()) {return;}// 创建线程池,线程队列大小为10000,线程队列满时拒绝任务,拒绝策略为自定义的RefreshNodeRejectHandlerthreadPoolExecutor = new ThreadPoolExecutor(1, 4, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10000),Executors.defaultThreadFactory(), refreshNodeRejectHandler);while (executeRunningData()) {// 如果线程队列大于6000或者线程队列为空且线程数小于等于0,则线程休眠5sif (threadPoolExecutor.getQueue().size() >= 6000 || (threadPoolExecutor.getQueue().isEmpty()&& threadPoolExecutor.getActiveCount() == 0)) {try {// 线程休眠5slong sleepTimes = 5000;Thread.sleep(sleepTimes);} catch (InterruptedException e) {System.out.println("线程休眠异常");}}}}private boolean openFleshNode() {// 从数据字典获取打开开关String isOpen = "Y";return StringUtils.equals(isOpen, "Y");}private boolean paushFleshNode() {// 从数据字典获取暂停开关String isPause = "N";return StringUtils.equals(isPause, "Y");}// 处理running数据,设置为true代表一直执行的方法protected boolean executeRunningData() {while (!paushFleshNode() && CollectionUtils.isNotEmpty(nodeMapper.getNodeList())) {// 这里锁名建议定义枚举类RLock lock = redissionClient.getLock("fleshNode");List<NodeVo> nodeVoList = new ArrayList<>();try {// 设置等待时间10s,锁过期时间60sif (!lock.tryLock(10, 60, TimeUnit.SECONDS)) {continue;}System.out.println("执行刷新网元逻辑,写入数据库");} catch (InterruptedException e) {System.out.println("获取锁失败");} finally {// 释放锁if (lock.isLocked() && lock.isHeldByCurrentThread()) {lock.unlock();}}for (NodeVo nodeVo : nodeVoList) {threadPoolExecutor.execute(() -> { System.out.println("执行网元其它操作业务,写入数据库:" + nodeVo); });}}return openFleshNode();}
}

三、项目结构及源码

在这里插入图片描述
源码下载,欢迎Star: demo-springboot-mybatisplus

相关文章:

利用Redisson分布式锁解决多服务器数据刷新问题

利用Redisson分布式锁解决多服务器数据刷新问题 一、业务背景二、代码实现1、引入Redisson依赖2、配置Redisson&#xff0c;实际项目中Redis为集群配置3、自定义拒绝策略4、异步刷新网元服务 三、项目结构及源码 一、业务背景 最近有个需求需要自动刷新网元服务&#xff0c;由…...

25.4.30数据结构|并查集 路径压缩

前言 在QuickUnion快速合并的过程中&#xff0c;每次都要找根ID&#xff0c;而路径压缩让找根ID变得更加迅速直接。 路径压缩 针对的是findRootIndex()【查找根ID】进行的压缩。 需要实现的是&#xff1a; 在找根节点的过程中&#xff0c;记录这条路径上的所有信息&#xff0c;…...

react学习笔记3——基于React脚手架

React路由 相关理解 SPA的理解 单页Web应用&#xff08;single page web application&#xff0c;SPA&#xff09;。整个应用只有一个完整的页面。点击页面中的链接不会刷新页面&#xff0c;只会做页面的局部更新。数据都需要通过ajax请求获取, 并在前端异步展现。 路由的理…...

C#中的LINQ:简化数据查询与操作

引言 在现代软件开发中&#xff0c;处理和操作数据是不可避免的任务。无论是从数据库读取信息&#xff0c;还是对内存中的集合进行筛选、排序等操作&#xff0c;开发者都需要一种高效且易于使用的方法。C#中的LINQ&#xff08;Language Integrated Query&#xff09;正是为此而…...

OkHttp3.X 工具类封装:链式调用,支持HTTPS、重试、文件上传【内含常用设计模式设计示例】

OkHttp3.X 工具类封装&#xff1a;链式调用&#xff0c;支持HTTPS、重试、文件上传 基于OkHttp3.X封装&#xff0c;提供链式调用API&#xff0c;简化GET/POST请求&#xff0c;支持HTTPS、自动重试、文件上传等功能&#xff0c;提升开发效率。 在 Android 和 Java 开发中&#x…...

Unity SpriteEditor(精灵图片编辑器)

&#x1f3c6; 个人愚见&#xff0c;没事写写笔记 &#x1f3c6;《博客内容》&#xff1a;Unity3D开发内容 &#x1f3c6;&#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f50e;SpriteEditor&#xff1a; 精灵图片编辑器 &#x1f4cc;用于编辑2D游戏开发中使用的Sp…...

雅思写作--70个高频表达

文章目录 1. learn new skills学生通过户外活动学到很多新技2. take immediate action to do各国采取有效行动以保护环境政府采取了必要行动以减少失业。你应该立即采取行动来解3. communication skills4. grow significantly5. have many advantages1. learn new skills “lea…...

Anaconda中配置Pyspark的Spark开发环境

Anaconda中配置Pyspark的Spark开发环境 目录 1.在控制台中测试ipython是否启动正常2.安装好Java3.安装Spark并配置环境变量4.PySpark配置5.修改spark\conf下的spark-env文件6.测试Pyspark是否安装成功 1.在控制台中测试ipython是否启动正常 anaconda正常安装 这里先检查ipyt…...

Spring 提供了多种依赖注入的方式

构造器注入&#xff08;Constructor Injection&#xff09; 构造器注入是通过类的构造函数来注入依赖项。这是 Spring 推荐的方式&#xff0c;因为它提供了不可变性和更好的可测试性。 import org.springframework.stereotype.Component;Component public class ServiceA {pub…...

面经-计算机网络——OSI七层模型与TCP/IP四层模型的对比详解

OSI七层模型与TCP/IP四层模型的对比详解 一、图示解析&#xff1a;分层封装结构 你提供的图清晰展示了网络通信中从应用层到物理层的封装过程&#xff0c;每一层都会对上层的数据加上自己的头部信息&#xff08;Header&#xff09;&#xff1a; 应用层&#xff1a; 应用…...

网络安全知识问答微信小程序的设计与实现

网络安全知识问答微信小程序的设计与实现&#xff0c;说白了&#xff0c;就是搭建一款网络安全知识问答微信小程序&#xff0c;类似网络安全百科直通车。三步走。 需求沟通 进行需求沟通&#xff0c;此处省略1000字。 画草图 根据沟通的需求&#xff0c;进行整理&#xff0c…...

Canvas特效实例:黑客帝国-字母矩阵(字母雨)

黑客帝国-字幕矩阵&#xff08;字母雨&#xff09; 效果预览代码实现思路解析遗留问题 效果预览 话不多说&#xff0c;我们直接上效果&#xff1a;当页面加载完成&#xff0c;屏幕上会落下如瀑布般的绿色字母流&#xff0c;不断向下滑动&#xff0c;仿佛进入了黑客帝国的数字世…...

「Mac畅玩AIGC与多模态11」开发篇07 - 使用自定义名言插件开发智能体应用

一、概述 本篇介绍如何在 macOS 环境下,通过编写自定义 OpenAPI Schema,将无需认证的名言服务接入 Dify 平台,并开发基于外部公共数据的智能体应用。本案例继续实践 GET 请求型 API 的实际调用技巧。 二、环境准备 1. 确认本地开发环境 macOS 系统Dify 平台已部署并可访问…...

快速上手非关系型数据库-MongoDB

简介 MongoDB 是一个基于文档的 NoSQL 数据库&#xff0c;由 MongoDB Inc. 开发。 NoSQL&#xff0c;指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写&#xff0c;是对不同于传统的关系型数据库的数据库管理系统的统称。 MongoDB 的设计理念是为了应对大数据量、…...

响应式布局,在飞帆平台中如此简单

这些控件都是可以自己动手去实现的。也可以将这些控件复制到自己名下进行修改。 响应式布局https://fvi.cn/782...

UN R79 关于车辆转向装置形式认证的统一规定(正文部分1)

UN R79法规是针对转向装置的型式认证法规&#xff0c;涉及A/B1/C类的横向控制辅助驾驶功能&#xff0c;对各功能的功能边界、性能要求、状态提示、故障警示以及型式认证要提交的信息做了规范&#xff0c;本文结合百度文心一言对法规进行翻译&#xff0c;并结合个人理解对部分内…...

深度学习系统学习系列【1】之基本知识

文章目录 说明基础知识人工智能、机器学习、深度学习的关系机器学习传统机器学习的缺陷选择深度学习的原因深度学习的关键问题深度学习的应用深度学习的加速硬件GPU环境搭建主流深度学习框架对比 说明 文章属于个人学习笔记内容&#xff0c;仅供学习和交流。内容参考深度学习原…...

python3GUI--视频监控管理平台 By:PyQt5(详细讲解)

文章目录 一&#xff0e;前言二&#xff0e;相关知识1.PyQt52.RTSP协议&#x1f4cc; 简介&#xff1a;&#x1f9e9; 特点&#xff1a;&#x1f4e1; 工作方式&#xff1a; 2. **RTMP&#xff08;Real-Time Messaging Protocol&#xff09;**&#x1f4cc; 简介&#xff1a;&a…...

第十一届蓝桥杯 2020 C/C++组 既约分数

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 核心思路&#xff1a; 思路详解&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 既约分数 - 蓝桥云课 思路&a…...

如何让Steam下载速度解除封印?!

平时一直没注意到家里的路由器在偷懒。最近成功榨干家里的带宽&#xff0c;把平时一直20mb/s左右下载速度的路由器一番改造后成功steam下载速度稳定85Mb/s。平时一直都只发挥了他的1/3不到&#xff0c;真是太可惜了。 硬件 首先检查硬件&#xff0c;就千兆路由器而言&#xf…...

HOOK上瘾思维模型——AI与思维模型【88】

一、定义 HOOK上瘾思维模型是一种通过设计一系列的触发&#xff08;Trigger&#xff09;、行动&#xff08;Action&#xff09;、奖励&#xff08;Reward&#xff09;和投入&#xff08;Investment&#xff09;环节&#xff0c;来促使用户形成习惯并持续使用产品或服务的思维框…...

基于开源AI智能名片链动2+1模式S2B2C商城小程序的IP开发泡沫破局与价值重构研究

摘要&#xff1a;当前IP开发领域普遍存在"冒进式泡沫"现象&#xff0c;企业将初级IP包装为超级IP运营&#xff0c;导致资源错配与价值虚化。本文通过实证分析开源AI智能名片链动21模式S2B2C商城小程序的技术架构与商业逻辑&#xff0c;揭示其通过智能内容引擎、合规化…...

深⼊理解指针(8)

1.对上一篇的补充内容 typedef int* ptr_t #define PTR_T int* 这两种写法都是可以的 ptr_t p1, p2; //p1, p2 都是指针变量 PTR_T p3, p4; //p3 是指针变量, p4是整型变量 为什么p3 是指针变量, p4是整型变量呢&#xff1f; 因为PTR_T 真的被改为了 int* 在编译器中…...

【iview】icon样式

A. 工程中引入样式文件 iview源码工程中的example工程中如何引入iview样式 image.png 自定义工程中如何引入iview样式 一般在src/main.js中引入&#xff08;在index.html中也可以&#xff0c;当然app.vue中也可以&#xff09; import "iview/dist/styles/iview.css"B…...

【计算机视觉】三维视觉:Nerfstudio:模块化神经辐射场框架的技术突破与实战指南

深度解析Nerfstudio&#xff1a;模块化神经辐射场框架的技术突破与实战指南 技术架构与核心创新系统架构设计关键技术特性 环境配置与安装指南硬件要求全平台安装流程 实战全流程解析1. 数据采集与预处理2. 模型训练与优化3. 可视化与导出 核心技术深度解析1. 混合表示网络2. 渐…...

第二章 OpenCV篇-图像阈值的综合操作-Python

目录 一.图像阈值 二.图像平滑 1.均值滤波 2.方框滤波 3.高斯滤波 4.中值滤波 5.双边滤波 此章节主要讲解&#xff1a;图像阈值、图像平滑处理、均值滤波、方框滤波、高斯滤波、中值滤波、双边滤波。 这里先讲作者使用matplotlib模块出现错误的解决方法。 首先作者在这…...

WPF处理大规模激光数据计算与安全传输处理

WPF大规模激光数据处理与安全传输系统设计方案 一、系统架构设计 1. 整体架构 ┌─────────────────────────────────────────────┐ │ WPF客户端应用 │ ├───────────────┬…...

vue 常见ui库对比(element、ant、antV等)

Element UI 1. 简介 Element UI 是一个基于 Vue 2 和 Vue 3 的企业级 UI 组件库&#xff0c;提供了丰富的组件和主题定制功能。官方网站&#xff1a;Element UI 2. 主要特点 丰富的组件&#xff1a;包括表单、表格、布局、导航、弹窗等多种组件。主题定制&#xff1a;支持主…...

【c++】【STL】stack详解

目录 stack类的作用什么是容器适配器stack的接口构造函数emptysizetoppushpopswap关系运算符重载 stack类的实现 stack类的作用 stack是stl库提供的一种容器适配器&#xff0c;也就是我们数据结构中学到的栈&#xff0c;是非常常用的数据结构&#xff0c;特点是遵循LIFO&#…...

单片机-89C51部分:12 pwm 呼吸灯 直流电机

飞书文档https://x509p6c8to.feishu.cn/wiki/JkzfwSoFBiUKc4kh8IoccTfyndg 一、什么是PWM&#xff1f; PWM是脉冲宽度调制的缩写&#xff0c;它是一种通过调整脉冲信号的高电平和低电平时间比例来控制电路输出的技术。简单来说&#xff0c;PWM是一种控制电子设备输出电压或电…...

WPF实现数据库操作与日志记录

1. 数据库操作实现 1.1 数据库连接基类 public abstract class DatabaseBase : IDisposable {protected string ConnectionString { get; }protected IDbConnection Connection { get; private set; }protected DatabaseBase(string connectionString){ConnectionString = co…...

用spring-boot-maven-plugin打包成单个jar有哪些缺点优化方案

Spring Boot 的 Fat JAR&#xff08;通过 spring-boot-maven-plugin 打包&#xff09;虽然简化了部署&#xff0c;但也存在一些潜在缺点&#xff0c;需根据场景权衡&#xff1a; 1. 启动速度较慢 原因&#xff1a; Fat JAR 需要在启动时解压并加载所有依赖的 JAR 文件到类路径…...

Spring Boot 使用 WebMagic 爬虫框架入门

1. 创建 Spring Boot 项目 使用 Spring Initializr 创建一个 Spring Boot 项目&#xff0c;选择需要的依赖&#xff0c;如 Spring Web 等。 2. 添加 WebMagic 依赖 在项目的 pom.xml 文件中添加 WebMagic 的核心和扩展依赖&#xff1a; <dependency><groupId>u…...

【软件设计师:复习】上午题核心知识点总结(二)

一、计算机网络(常考) 1.网络模型与协议(必考) 1.OSI七层模型 vs. TCP/IP四层模型 OSI七层TCP/IP四层核心协议/设备功能应用层(Application)应用层HTTP、FTP、DNS、SMTP提供用户接口和服务表示层(Presentation)SSL/TLS、JPEG、ASCII数据格式转换、加密/解密会话层(S…...

TensorRt10学习第一章

建立TensorRt时必须要有Public ILogger,因为createInferBuiler和createruntime要用&#xff0c;是一个接口 出错打印 和...

【LeetCode Hot100】回溯篇

前言 本文用于整理LeetCode Hot100中题目解答&#xff0c;因题目比较简单且更多是为了面试快速写出正确思路&#xff0c;只做简单题意解读和一句话题解方便记忆。但代码会全部给出&#xff0c;方便大家整理代码思路。 46. 全排列 一句话题意 给定一个无重复数字的序列&#xf…...

Go 语言中一个功能强大且广泛使用的数据验证库github.com/go-playground/validator/v10

github.com/go-playground/validator/v10 是 Go 语言中一个功能强大且广泛使用的数据验证库&#xff0c;主要用于对结构体字段进行数据校验&#xff0c;确保数据的合法性和完整性。以下是其核心作用、使用场景及代码案例的详细说明&#xff1a; 核心作用 数据校验 支持对结构体…...

Java 多线程进阶:线程安全、synchronized、死锁、wait/notify 全解析(含代码示例)

在 Java 并发编程中&#xff0c;“线程安全” 是核心议题之一。本文将深入讲解线程安全的实现手段、synchronized 的使用方式、可重入锁、死锁的成因与避免、wait/notify 通信机制等&#xff0c;并配合实际代码案例&#xff0c;帮助你彻底搞懂 Java 线程协作机制。 一、线程安全…...

windows电脑端SSH连接开termux的安卓端

&#xff08;确保你此前已经安装好了ssh&#xff09;在手机termux当中输入&#xff1a; 查看状态&#xff1a;ssh 启动服务&#xff1a;sshd 查看IP&#xff1a;ifconfig 然后在电脑端&#xff1a;...

Java 期中考试练习题

一、引言 Java 作为一门广泛应用的编程语言&#xff0c;在计算机相关专业的课程体系中占据重要地位。期中考试是检验同学们对 Java 知识掌握程度的重要环节。本文将呈现一些典型的 Java 期中考试试题&#xff0c;并进行详细讲解&#xff0c;希望能帮助大家更好地理解和掌握 Ja…...

【Unity】 组件库分类详解

1️⃣ Audio&#xff08;音频组件&#xff09; 用于处理游戏中的声音。 Audio Source 读音[ˈɔːdiəʊ ˈsɔːs]&#xff0c;音频源组件&#xff0c;用于播放音频文件&#xff0c;可设置音量、Pitch、循环播放等属性&#xff0c;是音频播放的核心组件。 Audio Listener 读音…...

Java 中使用正则表达式

1. 引入包 在使用正则表达式之前&#xff0c;需要引入包&#xff1a; import java.util.regex.Matcher; import java.util.regex.Pattern; 2. 常用模式规则 元字符 &#xff1a;这些是正则表达式中的特殊字符&#xff0c;用于匹配特定的模式。 . &#xff1a;匹配任意单个字…...

如何降低LabVIEW开发费用

在 LabVIEW 开发过程中&#xff0c;开发费用是用户和开发者共同关注的重点。过高的开发成本可能会压缩项目利润空间&#xff0c;甚至影响项目的可行性。下面将介绍降低 LabVIEW 开发费用的有效方法。 ​ 合理规划项目需求&#xff0c;避免后期增加​ 在项目启动阶段&#xff…...

WPF使用SQLSugar和Nlog

WPF应用中使用SQLSugar和NLog实现数据库操作与日志记录 1. 准备工作 首先,通过NuGet安装必要的包: Install-Package SQLSugarCore Install-Package NLog Install-Package NLog.Config Install-Package NLog.Targets.File 2. 配置NLog 在项目中添加nlog.config文件: <…...

Python10天冲刺-设计模型之策略模式

策略模式是一种行为设计模式&#xff0c;它允许你在运行时动态地改变对象的行为。这种模式的核心思想是将一组相关的算法封装在一起&#xff0c;并让它们相互替换。 下面是使用 Python 实现策略模式的一个示例&#xff1a; 示例代码 假设我们有一个简单的购物车系统&#xf…...

Js扩展DOM、BOM、AJAX、事件、定时器

BOM 操作 BOM指的是浏览器对象模型&#xff1a;Browser Object Mode&#xff0c;通过操作 window 对象的属性和方法来实现与浏览器的交互。 BOM的构成如下图所示&#xff1a; 其中&#xff0c;window对象是顶级对象&#xff0c;在 window 对象下面有一些重要的属性&#xff1…...

奥地利学派方法论的三个基础

主观价值论&#xff1a; 一切估价行为皆来自于个人&#xff0c;价格现象只能从主观估价中得到解释。 个人只在边际上做决策&#xff0c;边际价值是递减的。 罗斯巴德的等式&#xff1a;三个单位的某个东西的总效用 > 两个单位的总效用 > 一个单位的总效用&#xff0c;但…...

WPF之Image控件详解

文章目录 1. 概述2. Image控件的基本属性2.1 Source属性2.2 Stretch属性2.3 StretchDirection属性 3. 在XAML中使用Image控件3.1 基本用法3.2 设置拉伸模式3.3 设置图像对齐方式 4. 在代码中操作Image控件4.1 加载本地图像4.2 异步加载图像4.3 从流中加载图像4.4 控制图像的解码…...

如何将 VS Code 与 Linux 系统高效连接:从入门到进阶

引言 无论是开发服务器应用、管理远程主机&#xff0c;还是在本地 Linux 环境中提升开发效率&#xff0c;Visual Studio Code&#xff08;VS Code&#xff09; 凭借其强大的扩展能力&#xff0c;成为连接 Linux 系统的利器。本文将详细介绍 三种主流方法&#xff0c;助你无缝对…...

Matlab/Simulink - BLDC直流无刷电机仿真基础教程(五) - animateRotorPosition脚本讲解与使用

Matlab/Simulink - BLDC直流无刷电机仿真基础教程&#xff08;五&#xff09; - animateRotorPosition脚本讲解与使用 前言一、animateRotorPosition脚本内容二、脚本功能讲解三、脚本修改与模型配置四、可视化效果展示五、修改后脚本内容文章相关模型文件下载链接参考链接 前言…...