本文详解如何在 spring boot webflux 中构建一个每秒轮询数据库并实时推送最新记录描述的响应式数据流,重点解决 `mono` 与 `flux` 的正确组合方式,避免阻塞与类型不匹配问题。
在响应式编程中,不能将阻塞式思维套用于异步流操作。原始代码中试图在 map() 内直接“获取” Mono 并拼接字符串,这会导致编译失败(类型不匹配)和逻辑错误——因为 Mono 是一个异步容器,其值尚未发出,无法直接参与字符串运算。
正确的做法是使用 flatMap:它专为“将每个元素映射为一个新的 Publisher(如 Mono 或 Flux),并自动扁平化订阅结果”而设计。当 Flux.interval() 每秒发出一个 Long 信号时,flatMap 会触发一次 reactiveDocumentRepository.findLastDocument() 查询,并将查询结果(Mono)转换为 Mono,最终合并进主流,形成稳定的 Flux。
以下是修正后的完整控制器示例: