定时任务与延迟队列核心差异解析:从原理到Spring Boot实战选型
1. 先搞清楚定时任务和延迟队列到底解决的是两类问题很多人一听到“定时任务”和“延迟队列”第一反应是它们都能“等一会儿再执行”功能好像差不多。但实际落地时如果你用定时任务去处理所有“延迟”需求很快就会遇到任务堆积、时间不准、资源浪费甚至系统雪崩的问题。定时任务的核心是“定点”。它像一个严格的日程表在预设的、确定的时间点比如每天凌晨2点或者每5分钟触发执行。它的关注点是“什么时候开始”并且通常是周期性或固定时刻的。你启动一个定时任务系统就会在未来的那个时间点忠实地执行你定义好的逻辑。延迟队列的核心是“延时”。它像一个待办事项清单每一条任务都自带一个“倒计时”。任务被提交到队列时就指定了“需要等待多久再处理”比如“30秒后检查订单状态”、“5分钟后发送提醒短信”。它的关注点是“从此刻起多久之后执行”并且任务之间通常是独立的、一次性的。所以标题的答案很直接因为定时任务解决不了“动态、一次性、大量、精确延时”的场景。当你需要处理“用户下单15分钟未支付则自动取消”这类业务时用定时任务去轮询数据库和用延迟队列去触发单个任务在资源消耗、时效性和代码复杂度上完全是两个量级。下面我会结合常见的Spring Boot、Quartz、XXL-Job以及Linux Crontab这些热搜技术栈拆解为什么不能混用以及什么情况下该选哪个。2. 从四个真实痛点看定时任务处理延迟需求的局限当你试图用定时任务比如Scheduled、Quartz Job、XXL-Job来模拟延迟队列的功能时几乎一定会踩下面这几个坑。2.1 资源浪费与性能瓶颈轮询的代价最常见的做法是写一个定时任务每隔几秒比如5秒扫描一次数据库查找那些“创建时间超过15分钟且状态为‘待支付’”的订单然后批量取消。// 一个典型的、有问题的“定时任务实现延迟”示例 Scheduled(cron 0/5 * * * * ?) public void cancelUnpaidOrders() { ListOrder orders orderMapper.selectUnpaidOrders(Duration.ofMinutes(15)); for (Order order : orders) { cancelOrder(order); } }问题在哪无效扫描即使没有待取消的订单这个任务也会每5秒执行一次对数据库进行全表或索引扫描产生大量无效的IO和CPU开销。时间不精确一个在14分58秒创建的订单要到15分整下一次任务执行才会被扫描到实际等待了15分2秒存在最多一个扫描周期5秒的误差。批量处理压力如果某一瞬间有大量订单到达15分钟阈值这次扫描会一次性处理它们可能导致下游服务如支付关单接口瞬时压力过大。而延迟队列的处理方式是订单创建时就生成一个“15分钟后取消”的任务消息丢进队列。队列引擎如RabbitMQ的DLXTTLRocketMQ的定时消息或Redis的ZSet负责计时时间一到自动将消息投递给消费者。没有轮询只有事件触发。2.2 调度粒度与灵活性问题难以应对动态延迟定时任务的执行周期是在配置里写死的。假设你有个需求用户点击“延迟发送邮件”可以选择1小时后、3小时后或明天早上9点发送。用定时任务怎么实现你不可能为每个用户动态创建或修改一个Cron表达式。通常的蹩脚方案是用一个短周期如1分钟的任务不断扫描一个“待发送邮件表”判断当前时间是否大于或等于计划的发送时间。这本质上又把延迟队列的问题退化成了轮询扫描表继承了所有轮询的缺点。而延迟队列原生支持为每条消息设置独立的延迟时间完美契合这种场景。2.3 分布式环境下的并发与幂等困境在Spring Cloud分布式架构中定时任务如果部署多个实例默认情况下每个实例都会执行导致任务被重复执行。你需要引入额外的分布式锁如基于Redis或ZooKeeper来保证同一时间只有一个实例执行任务。// 需要增加分布式锁来避免重复执行 Scheduled(cron 0 0 2 * * ?) public void distributedDailyReport() { String lockKey job:lock:dailyReport; RLock lock redissonClient.getLock(lockKey); if (lock.tryLock(0, 30, TimeUnit.SECONDS)) { try { // 真正的业务逻辑 generateDailyReport(); } finally { lock.unlock(); } } }这增加了复杂度。而延迟队列的消息具有天然的“竞争消费”特性。多个消费者监听同一个队列一条消息只会被其中一个消费者获取并处理前提是队列模型是Point-to-Point分布式协调的问题由消息中间件解决了。另一个问题是幂等性。定时任务扫描处理批量数据如果某条数据在处理中途失败或需要重试逻辑会变得复杂。延迟队列的消息如果消费失败通常可以重新投递重回队列或进入死信队列配合消息的唯一ID更容易实现幂等消费。2.4 任务管理与可见性差通过ps -ef | grep cron或者翻看Spring Boot日志来管理定时任务非常原始。像“XXL-Job”这类调度中心之所以流行就是因为它提供了任务管理、执行日志、运行报表和故障告警的能力。但是如果你用XXL-Job去执行上面说的“每5秒扫库取消订单”任务你只是在管理这个“扫描器”而不是管理“取消订单”这个业务动作本身。成千上万个独立的延迟任务被压缩成了一个批处理任务你失去了对每个独立任务的跟踪能力。延迟队列则不同每一条消息都是一个独立的任务单元。成熟的队列系统提供消息轨迹查询你可以知道任意一个“取消订单”任务何时入队、何时就绪、何时被消费、是否成功。这种细粒度的可观测性对于排查线上问题至关重要。3. 技术选型什么场景下该用什么方案理解了根本差异选型就清晰了。这不是二选一而是让它们各司其职。3.1 坚定不移使用定时任务的场景这些场景的特点是计划明确、周期固定、处理逻辑面向集合。数据清洗与归档每日凌晨3点将30天前的日志转移到历史表。生成聚合报表每小时统计一次平台交易额更新缓存。定时拉取同步每隔10分钟从第三方API拉取一次汇率数据。缓存预热在早高峰开始前提前加载热门商品数据到缓存。技术栈参考单机简单任务Spring Boot的Scheduled。注意在SchedulerConfig中配置线程池避免任务相互阻塞。分布式、需要高可用与管理界面XXL-Job、Elastic-Job。它们解决了分布式执行、故障转移和任务管理的问题。复杂调度如日历调度、依赖任务Quartz。注意Spring Boot集成Quartz时如果多个任务只执行最后一个通常是SchedulerFactoryBean配置问题确保每个JobDetail都有独立的name和group。操作系统级别Linux Crontab。用于执行服务器级别的脚本如定时备份、清理临时文件。3.2 必须考虑延迟队列的场景这些场景的特点是延时触发、一次性、任务独立、时间要求相对精确。电商订单自动取消下单后15/30分钟未支付系统自动取消。异步任务延时重试调用外部API失败不是立即重试而是放入队列延迟5秒、10秒、30秒进行阶梯式重试。消息延迟推送用户注册后等待10分钟再推送一条新手教程提醒。会话级延时操作在直播或会议中“10分钟后提醒我”这类功能。分布式事务的最终一致性检查发起一个业务操作后发送一条延迟消息用于在最终阶段检查前置操作是否全部完成。技术栈参考Redis使用有序集合ZSet。将任务序列化为字符串作为member执行时间戳作为score。用一个定时线程或另一个短周期定时任务轮询ZSet中score小于当前时间的元素。这是自研延迟队列最常用的方案轻量但需要自己实现消费端和可靠性保证。// 生产者添加延迟任务 String taskId UUID.randomUUID().toString(); String taskJson JSON.toJSONString(myTask); redisTemplate.opsForZSet().add(delay_queue, taskJson, System.currentTimeMillis() delayMillis); // 消费者轮询获取就绪任务通常在一个独立线程中 SetString readyTasks redisTemplate.opsForZSet().rangeByScore(delay_queue, 0, System.currentTimeMillis(), 0, 10); if (!readyTasks.isEmpty()) { redisTemplate.opsForZSet().remove(delay_queue, readyTasks.toArray()); for (String taskJson : readyTasks) { // 处理任务 processTask(taskJson); } }RabbitMQ使用死信交换机DLX。创建一个普通队列A不给消费者并设置它的x-message-ttl消息存活时间和x-dead-letter-exchange死信交换机。消息在队列A中过期后会被自动转发到绑定的死信交换机进而路由到真正的处理队列B。这是利用现有MQ实现延迟队列的经典模式。RocketMQ原生支持定时/延时消息。在发送消息时直接设置delayTimeLevel即可开箱即用可靠性高是阿里系技术栈下的首选。Kafka本身不支持延迟消息。可通过“时间轮多个主题”的方式自研或将消息发送到一个待处理主题由外部调度器如Quartz在延迟后重新投递方案较重。专业延迟队列中间件如DelayQueueJava内置单机、beanstalkd轻量级分布式。在特定场景下可以考虑。3.3 关于“Cursor IDE支持长期定时任务”的解读这是一个来自热搜的有趣问题。Cursor这类AI辅助IDE其“定时任务”概念通常指的是本地开发环境下的自动化脚本或代码生成计划的调度比如“每周一早上自动为我生成周报代码骨架”。这和我们在服务端讨论的生产级分布式定时/延迟任务是两回事。它可能是一个内置的、简单的任务调度器用于提升开发体验而不是为了处理高并发的业务延迟逻辑。在选择技术方案时一定要明确场景边界是开发工具链自动化还是核心业务逻辑调度。4. 实战在Spring Boot中整合延迟队列以Redis方案为例理论说完我们来落地一个最实用的方案基于Redis ZSet实现一个简易但可靠的延迟队列。我会把重点放在可靠性设计和避坑点上。4.1 核心设计不只是ZSet轮询最简单的ZSet轮询有一个致命问题如果消费者从ZSet取出任务后、在处理前崩溃这个任务就永远丢失了。因此一个健壮的方案需要“待处理”状态。设计流程生产者将任务放入delay_queue:zsetKeyscore 当前时间戳 延迟毫秒数。消费者 a.获取使用ZRANGEBYSCORE WITHSCORES获取已到期的任务。 b.转移使用Lua脚本原子性地将这些任务从ZSet移除并同时放入一个processing_queue:list正在处理队列。 c.处理从processing_queue:list中取出任务执行。 d.确认执行成功从processing_queue:list中移除或直接弹出。 e.重试如果处理失败将任务重新放回delay_queue:zset并设置一个新的、稍晚的score实现重试延迟。兜底另一个守护线程定期扫描processing_queue:list中滞留时间过长的任务可能因消费者崩溃而残留将其重新放回delay_queue:zset进行重试。4.2 关键代码实现与避坑点1. Lua脚本保证原子性这是避免并发竞争的关键。将“从ZSet获取并移除”和“加入处理队列”作为一个原子操作。-- move_expired_tasks.lua local zsetKey KEYS[1] -- delay_queue:zset local listKey KEYS[2] -- processing_queue:list local currentTime tonumber(ARGV[1]) local limit tonumber(ARGV[2]) -- 获取已过期的任务 local expiredTasks redis.call(ZRANGEBYSCORE, zsetKey, 0, currentTime, LIMIT, 0, limit) if #expiredTasks 0 then -- 从ZSet中移除它们 redis.call(ZREM, zsetKey, unpack(expiredTasks)) -- 将它们加入到处理队列的右侧尾部 for i, task in ipairs(expiredTasks) do redis.call(RPUSH, listKey, task) end end return expiredTasks2. Spring Boot 配置与组件Component Slf4j public class RedisDelayQueue { Autowired private StringRedisTemplate redisTemplate; Autowired private RedisScriptList moveExpiredTasksScript; private static final String DELAY_QUEUE_KEY delay_queue:zset; private static final String PROCESSING_QUEUE_KEY delay_queue:processing:list; /** * 添加延迟任务 * param taskId 任务ID用于幂等 * param taskBody 任务内容 * param delayMillis 延迟毫秒数 */ public void addTask(String taskId, String taskBody, long delayMillis) { long score System.currentTimeMillis() delayMillis; // 可以用taskId作为member避免重复添加这里简化用taskBody String finalMember taskId : taskBody; redisTemplate.opsForZSet().add(DELAY_QUEUE_KEY, finalMember, score); } /** * 消费者轮询方法通常由一个Scheduled定时驱动或独立线程执行 */ Scheduled(fixedDelay 1000) // 每1秒尝试拉取一次 public void pollAndProcess() { long currentTime System.currentTimeMillis(); int batchSize 10; // 一次最多拉取10条防止雪崩 // 原子性地移动任务到处理队列 ListString tasks redisTemplate.execute( moveExpiredTasksScript, Arrays.asList(DELAY_QUEUE_KEY, PROCESSING_QUEUE_KEY), String.valueOf(currentTime), String.valueOf(batchSize) ); if (tasks ! null !tasks.isEmpty()) { for (String task : tasks) { try { // 处理单个任务 processSingleTask(task); // 处理成功从处理队列中移除这里用LPop因为我们是顺序处理 // 更严谨的做法是记录任务ID用LREM移除 redisTemplate.opsForList().leftPop(PROCESSING_QUEUE_KEY); } catch (Exception e) { log.error(处理延迟任务失败: {}, task, e); // 处理失败可以记录失败次数超过阈值则丢弃或告警 // 这里简单地将任务重新放回延迟队列延迟60秒重试 redisTemplate.opsForZSet().add(DELAY_QUEUE_KEY, task, System.currentTimeMillis() 60000); // 同时也要从处理队列中移除失败的任务 redisTemplate.opsForList().remove(PROCESSING_QUEUE_KEY, 1, task); } } } } private void processSingleTask(String task) { // 解析task执行你的业务逻辑 log.info(处理延迟任务: {}, task); // 例如取消订单、发送提醒等 } }3. 避坑点与生产建议序列化ZSet的member和List的value建议使用JSON序列化包含任务ID、类型、业务参数和已重试次数。幂等性processSingleTask方法必须实现幂等。因为网络超时可能导致任务已处理但确认失败从而被重新投递。可以在业务逻辑层通过任务ID状态机判断。批量大小batchSize不宜过大防止一次处理过多任务拖垮下游服务。也不宜过小影响吞吐量。根据业务压力调整。消费速度Scheduled(fixedDelay)的间隔要小于你的最小延迟精度。如果你需要秒级延迟轮询间隔至少要在500ms以下。内存与持久化Redis是内存数据库大量延迟任务会占用内存。确保Redis配置了合适的最大内存和淘汰策略并开启AOF持久化以防数据丢失。对于海量延迟任务百万级以上应考虑分片Sharding或直接使用RocketMQ等专业队列。监控监控DELAY_QUEUE_KEY的ZSet大小和PROCESSING_QUEUE_KEY的List长度。如果持续增长说明消费速度跟不上生产速度或消费者卡住了。优雅停机在应用关闭时pollAndProcess线程应能完成当前正在处理的任务避免消息丢失。可以利用Spring的SmartLifecycle或监听ContextClosedEvent来实现。5. 决策清单与最终建议最后给你一个快速决策清单当你面临“该用定时任务还是延迟队列”这个问题时可以对照判断请使用定时任务如果[ ] 任务在固定的、日历化的时间点执行如每天、每周、每月。[ ] 任务处理的是批量数据集合如全表扫描、批量计算。[ ] 任务执行周期较长小时、天级别对精确到秒级的延迟不敏感。[ ] 你需要一个集中式的管理界面来查看所有任务的执行历史和状态。请使用延迟队列如果[ ] 任务需要在未来的某个相对时间点触发如“10分钟后”、“2小时后”。[ ] 每个任务的延迟时间是动态的、各不相同的。[ ] 任务之间是独立的处理逻辑相同但数据不同。[ ] 你需要较高的时间精度秒级、毫秒级。[ ] 你希望避免对数据库进行高频轮询。[ ] 业务量很大需要平滑处理峰值避免批量处理造成的瞬时压力。混合架构是常态一个成熟的系统往往是两者并存。用XXL-Job调度每天的报表生成定时任务用RocketMQ延迟消息处理订单自动取消延迟队列。它们不是替代关系而是互补的组件。技术选型优先级建议如果公司已有RocketMQ直接使用它的延迟消息功能最省心、最可靠。如果已有RabbitMQ使用DLX死信队列方案理解其原理即可。如果中间件选择自由对于中小规模延迟场景基于Redis ZSet的自研队列是性价比很高的选择可控性强。千万级以上的海量、高精度延迟场景需要调研如Kafka时间轮、Pulsar或自研基于时间轮的调度服务。记住架构的选择始于对问题本质的区分。定时任务是“闹钟”到点就响处理一堆事延迟队列是“倒计时器”为每件事单独计时。下次当你设计“过一会儿再执行”的功能时先问自己这更像一个集体闹钟还是很多个独立的倒计时答案会清晰很多。

相关新闻

Obsidian插件LyricFlux:在知识库中无缝管理、播放与引用音乐

Obsidian插件LyricFlux:在知识库中无缝管理、播放与引用音乐

1. 先搞清楚 LyricFlux 到底解决了什么痛点如果你在用 Obsidian 管理笔记,同时又是个音乐爱好者,大概率会遇到一个麻烦:音乐文件散落在电脑各处,想听歌时得跳出笔记软件去打开播放器,歌词、专辑信息、歌手这些元数据&a…

2026/8/21 4:23:39 阅读更多 →
手搓BLDC无感方波电调:从反电动势检测到STM32实战

手搓BLDC无感方波电调:从反电动势检测到STM32实战

这次我们来看一个准大四学生在暑期实习期间,利用夜晚时间手搓的“SguanESC”电调算法库。这个项目聚焦于无刷直流电机(BLDC)的无感方波驱动,对于嵌入式开发、机器人、无人机或任何需要低成本、高效率电机控制的爱好者来说&#xf…

2026/8/21 4:23:39 阅读更多 →
Web自动化与RPA技术解析:从浏览器多开到行为模拟的工程实践

Web自动化与RPA技术解析:从浏览器多开到行为模拟的工程实践

大家好,最近在技术圈和副业圈里,关于“Ozon挂机项目”的讨论热度很高,很多开发者朋友都在研究如何通过技术手段实现自动化操作。作为一个技术博主,我习惯性地会去拆解这类项目背后的技术原理和实现路径,这本身就是一个…

2026/8/21 4:23:39 阅读更多 →

最新新闻

协议复盘的记录方式

协议复盘的记录方式

协议复盘的记录方式 制作赛博朋克风格的 3D 视觉 Web 应用时,开发者很容易踩进一个陷阱: 刚建好基础网格,就迫不及待地加上辉光(UnrealBloom)、故障艺术(GlitchPass)以及复杂的粒子系统。结果画…

2026/8/21 10:50:09 阅读更多 →
TSN交换机时钟竞争测试:从BMCA原理到工程实践

TSN交换机时钟竞争测试:从BMCA原理到工程实践

如果你正在开发或测试支持TSN(时敏以太网)的交换机,那么“时钟竞争”这个词很可能已经让你头疼过。在传统的网络测试中,我们关注丢包、延迟、吞吐量,但在TSN世界里,时钟同步的稳定性才是决定整个系统能否正…

2026/8/21 10:50:09 阅读更多 →
AI编程工具实战:Claude Code、Codex与CursorAI在Java开发中的集成与应用

AI编程工具实战:Claude Code、Codex与CursorAI在Java开发中的集成与应用

如果你是一名Java开发者,最近是否感觉自己的开发流程正在被悄然改变?过去,我们习惯了在IDE里逐行敲代码、反复调试、查阅文档;而现在,越来越多的同行开始谈论“Vibe Coding”、“Claude Code”、“Codex”这些新名词。…

2026/8/21 10:50:09 阅读更多 →
GPT模型在符号音乐生成中的核心挑战:坐标系不匹配与多维结构建模

GPT模型在符号音乐生成中的核心挑战:坐标系不匹配与多维结构建模

在探索将 GPT 这类强大的语言模型应用于符号音乐生成时,许多开发者和研究者都曾满怀期待,但很快就会发现,直接套用文本生成的成功经验往往收效甚微。模型生成的旋律可能缺乏连贯性,和声可能混乱不堪,或者音乐结构显得支…

2026/8/21 10:50:09 阅读更多 →
协作链路的拆分

协作链路的拆分

协作链路的拆分 开源 Go HTTP SDK 若使用固定间隔重试,网络波动会让大量客户端在同一时段重试,形成重试风暴并放大服务端负载。重试次数、间隔和预算需要按依赖承载能力设计。 开源库做重试机制,初衷是提高网络抗抖动能力;但如果缺…

2026/8/21 10:50:09 阅读更多 →
零基础转行网络安全,真实学习周期与就业方向详解

零基础转行网络安全,真实学习周期与就业方向详解

经常有同学问我:零基础转行网安,到底需要学多久?有没有清晰的就业方向?哪些岗位适合新手入门?今天结合行业真实情况,客观拆解网安转行的学习周期、岗位细分、能力要求,不鸡汤、不夸大&#xff0…

2026/8/21 10:49:08 阅读更多 →

日新闻

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

前言随着国家数字基础设施信创替代、关键技术自主可控战略持续深化,口岸智慧安防、边检智能管控领域正全面进入国产化、自主化、安全可控升级周期。当前国内机场边检旅客识别与定位体系长期依赖国外商用视觉算法、进口成像硬件、闭源通用计算平台,存在核…

2026/8/21 0:00:42 阅读更多 →
别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱当下数字化建设浪潮中,很多项目将三维可视化、视频贴图叠加的数字孪生等同于空间智能。传统数字孪生更多停留在三维场景复刻,擅长把物理世界“画出来、展示出来”,…

2026/8/21 0:00:42 阅读更多 →
105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40C到85C的影像质量一致性——ISP参数温漂补偿与产线标定策略 去年冬天在北方某车厂做A样评审,凌晨四点的黑河试验场,零下三十三度。客户拿了一台冷启动的车,中控屏上倒车影像全是雪花噪点,暗部细节直接糊成一片。我第一反应是sensor温度没上来,暗电流…

2026/8/21 0:00:42 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/21 0:02:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/20 6:11:08 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/20 21:46:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/21 0:14:22 阅读更多 →