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