WebFlux、R2DBC 与 RSocket 局部实验
公开入口(仓库根目录,JDK21、Maven3.9;本机MySQL已启动):
JAVA_HOME=$(/usr/libexec/java_home -v21) python3 labs/webflux-r2dbc/run.pyMySQL默认127.0.0.1:3306、root/空口令,复用本机已装服务;可通过U27_MYSQL_HOST、U27_MYSQL_PORT、U27_MYSQL_USER、U27_MYSQL_PASSWORD覆盖。账号需能创建和删除本次随机数据库;口令从环境读,不记录到公开JSON。不会调整现有MySQL配置、已有库表或其他存储服务。每次创建u27_r2dbc_<UUID>,CREATE成功才取得所有权,结束DROP同一库,清理失败使测试失败。所有新listener为loopback随机端口,Spring上下文和RSocket资源定向关闭,测试JVM退出关闭剩余全局客户端资源。
依赖由Boot4.0.9 BOM解析:Framework7.0.10、Reactor3.8.8、Reactor Netty1.3.8、RSocket1.1.5、r2dbc-mysql1.4.3、Security core7.0.8;JDK21 Liberica21.0.11+11、macOS arm64、MySQL8.4.7。pom的macOS native DNS依赖按OS/架构profile启用,其他平台走各自支持的Netty解析器。
| 类 | 实际输入和断言 | 证据边界 |
|---|---|---|
| AnnotationFunctionEndpointsTest(9) | 注解Mono、DTO Flux JSON/SSE、字符串Flux原样拼接、函数路由与先后、404、过滤器成功顺序、固定身份Context | bindToApplicationContext走真实框架,无网络;固定身份不是认证 |
| EventLoopServerTest(7) | 真实Netty线程、block检测/标量绕过、boundedElastic、404/500、身份载体 | 真HTTP但无TLS;服务端线程名为本组合事实 |
| WebClientHttpTest(7) | JDK HttpServer正常/404/500两次后恢复、400ms慢响应与100ms超时、RestClient对照、SSE take(2)取消后新请求 | 真HTTP;取消不撤销服务端副作用,不证明远端恰好只生产两项 |
| R2dbcTransactionTest(5) | 真实MySQL两连接ID对照、提交+2、错误回滚0、声明式事务及不订阅0、中途取消回滚0 | 本库无连接池;不外推锁、复制、提交未知或跨库事务 |
| RSocketInteractionTest(4) | 原生四模型、CANCEL传播/停止产帧 | 真TCP,无TLS/resume/lease持久恢复,Payload接收后释放 |
| SpringRSocketTest(1) | MessageMapping/Requester路由、未知路由错误、take取消、同连接再请求恢复 | 真Spring消息适配与TCP;无认证授权 |
运行证据只由完整成功入口生成,记录六类33测试、观察行、依赖解析、JDK/OS、输入/退出状态、源码与运行器sha256。原始日志每次独立写入~/.cache/software-engineering-study/java-depth-impl/u27/<UUID>/,不拼历史日志冒充一次通过。运行器总命令超时240秒,测试含明确等待上限;不要用本机耗时推导生产吞吐。
草稿失败也有教学意义:字符串并不自动JSON数组、重复响应头是多值、doFinally在终止向下游传播后执行,与doOnSuccess的回调顺序不同。正式断言使用实际媒体类型/编码器行为;不是删掉失败路径。500错误日志来自故意的boom端点。
权威正文与15题。响应式真实认证归U31,Data映射与repository归U44,数据缓冲与引用计数机制归U49,Servlet原链与旧源码保留。