【发布时间】:2018-07-09 02:56:34
【问题描述】:
我创建了 Spring Boot 2.0 演示应用程序,其中包含两个使用 WebClient 进行通信的应用程序。当我从 WebClient 的响应中使用 Flux 的 block() 方法时,他们经常停止通信,我很痛苦。由于某些原因,我想使用 List 而不是 Flux。
服务器端应用程序是这样的。它只是返回 Flux 对象。
@GetMapping
public Flux<Item> findAll() {
return Flux.fromIterable(items);
}
而客户端(或 BFF 端)应用程序是这样的。我从服务器获取 Flux 并通过调用 block() 方法将其转换为 List。
@GetMapping
public List<Item> findBlock() {
return webClient.get()
.retrieve()
.bodyToFlux(Item.class)
.collectList()
.block(Duration.ofSeconds(10L));
}
虽然一开始运行良好,但 findBlock() 多次访问后不会响应并超时。当我修改 findBlock() 方法以返回 Flux 删除 collectList() 和 block() 时,它运行良好。然后我假设 block() 方法会导致这个问题。
而且,当我修改 findAll() 方法以返回 List 时,没有任何变化。
整个示例应用的源代码在这里。
https://github.com/cero-t/webclient-example
“resource”是服务器应用程序,“front”是客户端应用程序。运行这两个应用程序后,当我访问 localhost:8080 时,它运行良好,我可以随时重新加载,但是当我访问 localhost:8080/block 时,它似乎运行良好,但在多次重新加载后它不会响应。
顺便说一句,当我将“spring-boot-starter-web”依赖项添加到“前端”应用程序(而不是资源应用程序)的 pom.xml 中时,这意味着我使用的是 tomcat,这个问题永远不会发生。是不是 Netty 服务器的问题?
任何指导将不胜感激。
【问题讨论】:
标签: spring-boot spring-webflux