WebClient是一个反应式客户端,它提供了RestTemplate的替代方案。 据说它是异步的。

但是我对以下代码表示怀疑:

 WebClient.create()             .method(HttpMethod.GET)             .uri("http://localhost:8080/testApi")             .retrieve()             .bodyToMono(String.class) 

它什么也没做。 没有发送任何http请求。 似乎没有触发。 除非我通过添加.block()触发它。 但这使事情不是“异步”。

另外,我所知道的是使用.subscribe()使事情看起来异步。

但是WebClient是为此目的设计的吗? 使用WebClient的最佳实践是什么?

===============>>#1 票数:0

WebClient使用Reactor Netty为Java提供一个完全异步的NIO网络库。

使用.block() ,您将阻塞不需要的调用线程。 对于I / O调用,应使用.flatMap ,它订阅内部流并在到达时动态合并结果。 例如,我会做:

Mono.just(httpRequest)     .flatMap(request -> request.exchange().bodyToMono(String.class))     .map(response -> doWhateverToTheResponse(response))     .subscribeOn(Schedulers.elastic())     .subscribe(); 

请注意, .flatMap()现在将订阅内部流。 当响应返回时,它将进入map ,流将继续。 当流在elastic线程上启动时,调用线程将变得空闲。

除非绝对必要,否则不要使用.block() 一个使用它的用例:Kafka的轮询循环。 您要确保在循环使用下一组记录之前已处理了一组记录。 .block()确保轮询线程保持阻塞状态,除非处理了所有记录。

编辑:几个月前,我在.flatMap()上写了一篇小文章。 我认为它写得很好,您可以在这里看看:

https://medium.com/swlh/understanding-reactors-flatmap-operator-a6a7e62d3e95

  ask by roast_soul translate from so

本文未有回复,本站智能推荐: