Spring反应式阅读web客户端响应
我正在学习SpringReactive,并拥有以下基本的Reactive演示代码Spring反应式阅读web客户端响应,spring,spring-webflux,reactive,spring-webclient,Spring,Spring Webflux,Reactive,Spring Webclient,我正在学习SpringReactive,并拥有以下基本的Reactive演示代码 import org.springframework.web.reactive.function.client.WebClient; // other imports etc @Slf4j class WebClientTests { private static String baseUrl = "http://localhost:8080"; private static WebC
import org.springframework.web.reactive.function.client.WebClient;
// other imports etc
@Slf4j
class WebClientTests {
private static String baseUrl = "http://localhost:8080";
private static WebClient client = WebClient.create(baseUrl);
@Test
void testWebClient() {
Instant start = Instant.now();
Flux.just(1,2,3)
.map(i -> client.get().uri("/person/{id}", i).retrieve().bodyToFlux(Person.class))
.subscribe(s -> {
log.info("subscribed: {}", s);
});
log.info("Elapsed time: " + Duration.between(start, Instant.now()).toMillis() + "ms");
}
}
它输出以下内容
20:32:55.251 [main] DEBUG io.netty.util.ResourceLeakDetector - -Dio.netty.leakDetection.targetRecords: 4
20:32:55.652 [main] INFO com.example.reactive.reactivedemo.WebClientTests - subscribed: MonoFlatMap
20:32:55.652 [main] INFO com.example.reactive.reactivedemo.WebClientTests - subscribed: MonoFlatMap
20:32:55.652 [main] INFO com.example.reactive.reactivedemo.WebClientTests - subscribed: MonoFlatMap
20:32:55.668 [main] INFO com.example.reactive.reactivedemo.WebClientTests - Elapsed time: 84ms
但是我不确定为什么它不输出get请求的值?它实际上并没有触发端点。您几乎肯定希望在
.map(i->client.get().uri…
行中使用flatMap()
,而不是map()
map()
用于同步转换,在同步转换中,您返回要映射到的实际值。您没有返回实际值-您是从映射方法返回发布者,因此发布者只是按原样返回-它永远不会被订阅,因为在订阅之前不会发生任何事情,所以您的web请求永远不会执行
flatMap()
用于非阻塞转换,其中您返回一个发布者,该发布者发出一个或多个要映射到的值。该发布者作为您的反应链的一部分订阅,该发布者发出的值沿着该链传递给下一个操作员。我猜是因为您没有对结果执行任何操作也许它被优化了。谢谢你的回答。我想你在这里发现了一些东西,但是它仍然没有触发请求?@Robbo_UK测试可能在你触发请求之前完成,因为你正在订阅但没有等待请求完成。如果你真的想这样运行测试,那么你应该使用blockLast()
而不是subscribe()
。