OXM、JMX、邮件与数据缓冲实验(U49)
独立新增工程:Liberica JDK21.0.11+11、Boot4.0.9 / Framework7.0.10。OXM 用真实 JAXB(glassfish-jaxb 4.0.9 运行时)与 Jackson 2 XML dataformat 2.21.7(Boot BOM 管理);JMX 用 JVM 平台 MBeanServer(不开远程连接器);邮件用 GreenMail 2.1.9 嵌入式真实 SMTP/IMAP(loopback 自动端口);数据缓冲用真实 UnpooledByteBufAllocator 与 spring-core DataBuffer API。本机 macOS27.2 arm64;版本由 4.0.9 parent/BOM 管理,GreenMail 显式钉版(不在 BOM 中)。旧机制无既有工程,本票为 F10 四项首次真实运行。
从仓库根运行完整公开入口:
JAVA_HOME=$(/usr/libexec/java_home -v21) python3 labs/spring-integration-capabilities/run.py需要 Python3、Maven3.9.9、本机 JDK21。无外部服务依赖;GreenMail 只监听 loopback 自动分配端口并在测试结束后停止;XSD 临时文件用后删除;入口记录 JDK/Maven、执行 clean test、核对四份 Surefire 计数(合计 14)、19 条 U49 观察行(每条恰好一次)、解析依赖版本并强制与 BOM 一致(spring-oxm 7.0.10、jakarta.mail 2.1.5、angus-mail 2.0.5、jackson-dataformat-xml 2.21.7、jaxb-runtime 4.0.9、greenmail 2.1.9、netty-buffer 4.2.19.Final),写入 evidence。
教材:Spring 官方集成能力_OXM_JMX_邮件与数据缓冲。
公开工程:根 POM、runner、OXM 测试、JMX 测试、邮件测试、DataBuffer 测试、教学模型 Order、教学模型 CacheStats、运行证据。
| 组 | 真实运行入口 | 实际观察 |
|---|---|---|
| OXM JAXB | 真实 Jaxb2Marshaller(jakarta JAXB) | 往返序列化按注解输出 <order currency="CNY">;supports() 对映射类 true、对 String false;非映射对象 marshal 抛 MarshallingFailureException;截断 XML 抛 UnmarshallingFailureException;DOCTYPE 默认拒绝(disallow-doctype-decl,supportDtd=false/processExternalEntities=false 默认),显式开 DTD 后无实体文档可解;XSD 违例被包装为 UnmarshallingFailureException(不是 ValidationFailureException——7.0.10 实测行为) |
| OXM Jackson 对照 | 真实 XmlMapper | 同一模型无 JAXB 注解时属性写为元素(<currency>CNY</currency>);未知字段可通过 FAIL_ON_UNKNOWN_PROPERTIES 关闭容忍 |
| JMX | 真实平台 MBeanServer + AnnotationMBeanExporter | @ManagedResource Bean 自动注册到平台 MBeanServer;仅带 @ManagedAttribute 的 getter 进 MBeanInfo(无注解 getter 不暴露);只读属性 setAttribute 抛 AttributeNotFoundException 且真实值不变;@ManagedOperation 远程调用清零并返回前值;上下文关闭自动注销;FAIL_ON_EXISTING 与已有 MBean 冲突时启动失败;Boot spring.jmx.enabled=true 后 health 端点以 org.springframework.boot:type=Endpoint,name=Health 注册且 JMX 调用返回 UP |
| 邮件 | JavaMailSenderImpl 真实连 GreenMail(SMTP 3025→自动端口 + IMAP) | SimpleMailMessage 与 MimeMessageHelper(HTML)各发一封,IMAP 真实协议登录读回两封(非 ASCII 正文按 MIME base64 传输,getContent 解码后可读);认证失败转 MailAuthenticationException;连接拒绝/服务端停止转 MailSendException 且 getFailedMessages() 记录失败者 |
| DataBuffer | 真实 UnpooledByteBufAllocator + spring-core buffer API | 分配 refCnt=1→retain 2→两次 release 归 0;双重释放抛 IllegalReferenceCountException;DefaultDataBufferFactory 非池化(release 返回 false);DataBufferUtils.join 聚合 10B 成功、超过 maxByteCount 抛 DataBufferLimitException;PARANOID 泄漏探测下故意不释放有泄漏记录(无 fail-on-leak 断言) |
14 个测试全部通过真实对象与真实 socket 协议观察行为:JAXB 用真实 XSD 校验器、JMX 用真实平台 MBeanServer 注册表、邮件用真实 SMTP/IMAP 协议交互、DataBuffer 用真实 Netty 引用计数器。没有 mock marshaller、没有 stub MBeanServer、没有假邮件服务器。
本机环境(一次运行的实际值)
BellSoft Liberica JDK 21.0.11(/usr/libexec/java_home -v21)、Maven 3.9.9、macOS 27.2.0 arm64;Boot 4.0.9 parent/BOM:Framework 7.0.10、glassfish-jaxb 4.0.9、jackson-2-bom 2.21.7、jakarta.mail 2.1.5 + angus-mail 2.0.5、netty 4.2.19.Final;GreenMail 2.1.9 显式钉版。实际解析版本、退出码、观察行与文件 SHA-256 见入口生成的 evidence/u49-*.json。
边界
- JMX:只在 JVM 平台 MBeanServer 上注册/调用;远程连接器(
ConnectorServerFactoryBean的 jmxmp/RMI service URL)未开放未运行;jconsole/VisualVM 实际连接未运行(无 GUI)。 - 邮件:GreenMail 是嵌入式真实 SMTP/IMAP,不是生产 MTA;TLS/STARTTLS、中继、附件大文件、投递重试未运行;RCPT 级部分拒绝(GreenMail 不做 RCPT 校验)未运行,部分失败用服务端停止造成 transport 断开验证。
- OXM:XStream/JiBX 等其他 Marshaller 未运行(官方文档列有但已非推荐);XML config namespace(
<oxm:jaxb2-marshaller>)装配未运行;Spring WS 的 MIME/MTOM 路径未运行。 - DataBuffer:泄漏观察依赖 ResourceLeakDetector 运行时日志,无 fail-on-leak 断言;Netty 池化 allocator(PooledByteBufAllocator)的 arena 行为未专项运行;WebFlux codec 的
maxInMemorySize全链路装配未运行(该配置语义在 WebFlux 正文)。 - 只使用合成数据与 loopback/平台内资源;不写用户数据,不触碰本机其他服务。
已知未运行
远程 JMX 连接(jconsole/jmxmp/RMI)、Spring Boot mail 的 JNDI Session、SendGrid 集成、Quartz/Freemarker/Caffeine(同属 spring-context-support 但各有专门票)、XML namespace 装配、XStream marshaller、WebFlux codec 全链路、池化 allocator 容量行为,均未在本实验运行;对应结论按教材标注为源码/配置推演或待验证。