Spring WebFlux WebClient如何通过subscribe异步打印字符串响应
问题解答
关于是否Alfresco不支持异步调用的说明
该现象完全和下游服务Alfresco无关,不是它不支持异步调用,是你对subscribe()方法的返回值理解有误:
- 无参
Mono.subscribe()的返回值是Disposable类型的订阅控制对象,你打印的reactor.core.publisher.LambdaSubscriber@77114efe就是这个对象的默认toString结果,本身就不会包含响应内容。 block()是阻塞当前线程等待响应流程走完,直接返回Mono发射的结果值,所以能直接拿到JSON字符串。
用subscribe异步打印响应的实现方案
你需要给subscribe()传入响应消费回调函数即可,异步回调会在响应到达时自动执行打印逻辑,示例代码如下:
private void getNodeDetail() { Mono<String> mono = webClient.get() .uri("/alfresco/api/-default-/public/alfresco/versions/1/nodes/f37b52a8-de40-414b-b64d-a958137e89e2") .retrieve().bodyToMono(String.class); // 传入回调实现异步处理 mono.subscribe( // 正常响应回调,拿到响应内容后打印 responseContent -> System.out.println(responseContent), // 异常回调,建议加上避免请求出错时异常被静默吞掉 error -> System.err.println("请求出错:" + error.getMessage()) ); }
补充注意事项
如果你的程序是本地控制台测试程序,主线程如果在订阅完成后直接退出,可能会看不到打印结果,因为异步请求还没完成进程就已经终止。这种场景可以临时加倒计时锁等待响应返回,正式Web服务环境下不需要额外处理,服务进程会保持运行等待回调触发。
内容的提问来源于stack exchange,提问作者Ajay Kumar
相关产品推荐
相关产品推荐

