我收到由 IllegalStateException 引起的 MonoError,原因是“底层 HTTP 客户端已完成但未发出响应。”。
NetworkList 是一个包含网络拓扑列表的类,并具有从方法 convertJsonToPojo 中调用的 setList。
client 是 Spring 5 (5.0.4.RELEASE) 中使用 reactor-netty (0.7.5.RELEASE) 的 WebClient (spring-webflux)。
以下片段显示了我如何使用 WebClient 对 type = BOARDS、CARDS、PORTS、ROUTERS 等进行异步调用,其中网络名称作为 projectName 传入,拓扑类型作为 type 传入。
NetworkList netList = new NetworkList();
client.get().uri("/{project}/{type}",projectName,type).retrieve().bodyToMono(String.class).subscribe(json -> this.convertJsonToPojo(Type.BOARD, json, netList));
我遇到的其余服务是一个单一的服务,它返回代表请求的组件的 json。
这似乎与Reactive WebClient Not Emitting A Response类似,但其中的响应指向以下 reactor-netty 问题Issue 138。该问题表明从 0.6.6.RELEASE 开始已修复。
所以我的问题是我在不知不觉中错误地使用了 WebClient 还是应该将其作为未修复的错误提交?我对 Spring 5 和 Reactive 库还很陌生,所以不想天真地提交错误。
提前感谢您的时间!
PS - 我有这个与 RestTemplate 和 CompletableFuture 一起工作,所以不需要提供这个建议作为替代方案。我的任务是开始迁移到反应式架构。谢谢!
更新 - 我相信我现在明白发生了什么,但希望得到某人的确认。我遇到的其余服务是传统服务,而不是响应式流。因此,在通话期间没有共享“阶段”更新。.subscribe() 期待一个反应流,因此从未收到完整的阶段。用 .block() 替换 .subscribe() 强制完成,代码现在可以工作。所以我从中学到的是,在处理传统的休息服务时,需要一个块。有人可以确认吗?谢谢!