跳到主要内容

同步使用

ChatGPT-4o 中英对照 Synchronous Use

WebClient 可以通过在末尾阻塞以获取结果的方式以同步风格使用:

Person person = client.get().uri("/person/{id}", i).retrieve()
.bodyToMono(Person.class)
.block();

List<Person> persons = client.get().uri("/persons").retrieve()
.bodyToFlux(Person.class)
.collectList()
.block();
java

然而,如果需要进行多次调用,避免对每个响应单独阻塞会更有效率,而是等待合并的结果:

Mono<Person> personMono = client.get().uri("/person/{id}", personId)
.retrieve().bodyToMono(Person.class);

Mono<List<Hobby>> hobbiesMono = client.get().uri("/person/{id}/hobbies", personId)
.retrieve().bodyToFlux(Hobby.class).collectList();

Map<String, Object> data = Mono.zip(personMono, hobbiesMono, (person, hobbies) -> {
Map<String, String> map = new LinkedHashMap<>();
map.put("person", person);
map.put("hobbies", hobbies);
return map;
})
.block();
java

以上仅仅是一个例子。还有许多其他模式和操作符可以用来构建一个反应式管道,该管道可以进行许多远程调用,可能有一些是嵌套的、相互依赖的,并且在结束之前不会阻塞。

备注

使用 FluxMono 时,在 Spring MVC 或 Spring WebFlux 控制器中不应进行阻塞。只需从控制器方法返回结果的响应式类型即可。同样的原则也适用于 Kotlin 协程和 Spring WebFlux,只需在控制器方法中使用挂起函数或返回 Flow