教学系统后端优化实录:Java 21 虚拟线程 + Spring AI 2.0 + Redis Lua 限流 AOP
背景对一个基于 Spring Boot 4.0 + MyBatis-Plus + PostgreSQL 的教学管理系统进行技术升级,参考了 spring-ai 企业级项目的架构模式,完成了三项核心优化。 一、Java 17 → 21 + 虚拟线程改动pom.xml 1<java.version>17</java.version> → <java.version>21</java.version> application.properties 1spring.threads.virtual.enabled=true 原理Spring Boot 4.0 原生支持 Java 21 虚拟线程(Project Loom)。开启后,Tomcat 请求处理线程、@Async 方法、WebFlux 调度线程全部切换为虚拟线程。 虚拟线程由 JVM 管理,不绑定 OS 线程,I/O 阻塞时自动让出 CPU。对于 AI API 调用、数据库查询、Redis 操作等 I/O 密集型场景,并发吞吐显著提升。 兼容性现有 pom...
作业批改系统技术优化日志
概述针对作业批改系统(Spring Boot 4.0.4 + OpenClaw Gateway)进行了一轮系统优化,涵盖定时任务、插件稳定性、接口文档、缓存性能四个维度。 一、OpenClaw Cron 定时播报需求每周五在 QQ 群自动播报未完成作业的学生名单。 架构12345OpenClaw cron(每周五 20:00) → web_fetch → 触发 Spring Boot /api/homework/tasks/remind-all → TaskReminderService.sendRecurringStatusReminder() → 查 class_student + submission → 未交名单 → OneBotHttpService → Napcat HTTP → QQ 群消息 关键代码HomeworkTaskMapper.java — 查活跃作业: 123@Select("SELECT * FROM homework_task WHERE status != 'closed' " + ...
作业批改系统高并发改造与 OpenClaw 集成实战
概述今天对作业批改系统进行了一次全面改造,解决了三大问题:高并发下的 AI 批改瓶颈、数据库查询性能、以及 OpenClaw OneBot 插件的消息分发故障。本文记录完整的排障过程和解决方案。 一、异步批改:从同步阻塞到 Redis Stream问题原系统 HomeworkController.submitHomework() 的流程是: 1学生提交 → Controller 线程阻塞等待 OpenClaw AI 批改(30-300s) → 写DB → 返回 30 个学生同时提交 → 30 个 Tomcat 线程全阻塞 → 新请求被拒绝 → 数据库连接池(HikariCP max 20)耗尽 → 雪崩。 方案参考 [InterviewGuide] 的 Redis Stream 异步架构: 123提交 → 入库(PENDING) → 入队(Redis Stream) → 秒回"已收到" ↓ 单线程 Consumer → 调 OpenClaw → 写回结果 → ACK 实现新增 5 ...
ESP32 NimBLE 蓝牙扫描"假死"问题排查与修复
问题现象ESP32-S3 BLE 打印机桥接项目中,以下操作流程必然复现: 打开蓝牙开关 → 扫描正常,设备列表填充 选择设备点击”连接” → 连接超时失败 → 按钮恢复 关闭蓝牙再打开 → MAC 列表全空,扫描彻底停止,再无新设备出现 根因分析一句话:ble_gap_connect() 使用 BLE_HS_FOREVER 无超时连接,软件层 10 秒判定失败后未取消底层连接过程,NimBLE 协议栈被永久占用,后续所有 ble_gap_disc() 扫描请求均被拒绝。 详细时序1234567891011121314151617181920① 点击"连接" → ble_task 调用 ble_connect_device() → ble_gap_connect(..., BLE_HS_FOREVER, ...) → NimBLE 开始无限时长的连接尝试② 10 秒软件超时 → ble_task 里 connected = false → 按钮恢复,但扫描未重启 → ble_scan_enabled 仍为 false③ 关闭蓝牙 ...
ESP32-S3 BLE 双角色桥接系统技术栈全解析
系统概览123456789┌──────────┐ BLE UART ┌──────────────┐ BLE GATT ┌──────────┐│ 手机 App │ ◄──────────► │ ESP32-S3 │ ◄──────────► │ 热敏打印机 ││ (Central) │ Peripheral │ (双角色桥接) │ Central │ (Peripheral) │└──────────┘ │ │ └──────────┘ │ ┌────────┐ │ │ │TJC串口屏│ │ │ │ UART2 │ │ │ └────────┘ │ └──────────────┘ ES...
ESP32-S3 BLE 双角色蓝牙模块重构实战
项目背景一个基于 ESP32-S3 的空气质量采样设备,搭载 TJC 串口屏作为人机交互界面。蓝牙模块承担双重角色: BLE 外设(Peripheral):通过 Nordic UART Service 与手机 App 通信 BLE 中心设备(Central):连接蓝牙热敏打印机,打印检测记录 蓝牙模块的核心文件为 printer_scan.c(约 1000 行)和 printer_scan.h。 问题发现:标志位混乱项目运行中出现以下异常现象: 蓝牙关闭时仍能触发连接 —— 串口屏的 connecting 按钮在蓝牙关闭状态下仍可被物理按键触发 连接状态显示不同步 —— 屏幕显示”已连接”但实际连接尚未建立 MAC 设备列表间歇性空 —— 开启蓝牙后扫描正常,但设备列表不显示任何设备 标志位多源写入 —— 同一个连接状态标志被 UI 处理函数和 BLE 任务同时写入 原始标志位全景12345678"蓝牙开关" → sys_status.bluetooth_open ──┐ ble_switch_enabled ───────...
RAG 技术全解析——从原理到实战,打造懂你的知识检索系统
开篇:大模型为什么需要 RAG?你问 ChatGPT “计算机一班有多少人”,它只能瞎编。 不是因为它不够聪明,而是因为它没见过你的数据。大模型的训练数据截止于某个时间点,对私有文档、企业内部数据、个人笔记一无所知。 RAG(Retrieval-Augmented Generation,检索增强生成) 就是解决这个问题的标准方案。 12345678910传统方式: RAG 方式:用户提问 用户提问 ↓ ↓LLM 直接回答 ① 先检索知识库(可能胡编) ↓ ② 找到相关文档片段 ↓ ③ 把片段 + 问题一起给 LLM ...
RAG 检索增强生成系统升级实录——从哈希伪向量到 ONNX 真实嵌入
背景为「作业批改系统」的 OneBot QQ Bot 接入 RAG(检索增强生成),让学生能通过 QQ 直接向知识库文档提问。插件侧配置已开启,但后端 RAG 接口返回异常。 时间线 时间 事件 10:09 发现 RAG 接口返回 {"enhancedMessage":"????","hasContext":false} 11:00 定位根因:SIMILARITY_THRESHOLD = 0.75 对哈希向量过高 11:13 实现 RRF 双路混合检索 11:27 修复 SQL 拼接空格/LIMIT 类型匹配 11:32 修复 LIMIT 参数类型 11:50 Gateway 重启导致 OneBot 断开 14:59 升级到 ONNX 真实嵌入模型 bge-small-zh-v1.5 15:27 模型下载完成,512 维向量就绪 15:31 pgvector 列维度不匹配报错,改表后修复 15:40 检索精度被 C 语言文档淹没,Top-K 从 3 提到 6 ...
作业批改系统开发实录:QQ机器人提醒功能实现
前言今天为作业批改系统增加了QQ机器人提醒功能,包括作业截止提醒、成绩不理想私聊提醒等。记录一下实现过程和遇到的问题。 功能需求 作业截止前群提醒 - 在截止前24小时和1小时发送群消息 成绩不理想私聊提醒 - 分数<60分时私聊学生 首次提交绑定QQ号 - 收集学生QQ号用于后续提醒 架构设计12345┌─────────────┐ HTTP ┌─────────────┐│ 后端服务 │◄────────────►│ Napcat ││ (Spring │ OneBot协议 │ (QQ机器人) ││ Boot) │ │ │└─────────────┘ └─────────────┘ 选择直接调用 Napcat HTTP 接口,而不是通过 OpenClaw Gateway,这样可以: 降低延迟 代码逻辑更清晰 AI对话和消息发送解耦 核心实现1. OneBot HTTP 服务12345678910111213141...
作业批改系统开发日志 - 2026-05-09
概述今天完成了作业批改系统的核心功能开发,包括作业任务管理、学生提交功能优化、个人成长曲线,以及前后端联调中的一系列踩坑记录。 数据库表结构变更homework_task 表(新建)用于管理老师发布的作业任务,支持截止时间、逾期扣分等特性。 1234567891011121314151617CREATE TABLE homework_task ( id SERIAL PRIMARY KEY, class_id BIGINT NOT NULL, task_name VARCHAR(200) NOT NULL, description TEXT, deadline TIMESTAMP, allow_late BOOLEAN DEFAULT TRUE, late_penalty INTEGER DEFAULT 0, status VARCHAR(20) DEFAULT 'active', created_by BIGINT, created_at TIMESTAMP DEFAULT CURRENT_TI...




