小编Shi*_*oto的帖子

我可以使用Spring5的WebClient返回的Flux的block()方法吗?

我创建了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()不会响应并且超时。当我修改find​​Block()方法以返回Flux并删除co​​llectList()和block()时,它运行良好。然后,我假设block()方法会导致此问题。
而且,当我修改find​​All()方法以返回List时,没有任何变化。

整个示例应用程序的源代码在这里。
https://github.com/cero-t/webclient-example

“资源”是服务器应用程序,“前端”是客户端应用程序。运行两个应用程序后,当我访问localhost:8080时,它运行良好,并且可以随时重新加载,但是当我访问localhost:8080 / block时,它似乎运行良好,但是在多次重载后,它不会响应。


顺便说一句,当我将“ spring-boot-starter-web”依赖项添加到“前端”应用程序(而非资源应用程序)的pom.xml时,这意味着我使用了tomcat,这个问题永远不会发生。这是由于Netty服务器引起的问题吗?

任何指导将不胜感激。

spring-boot spring-webflux

5
推荐指数
1
解决办法
6007
查看次数

标签 统计

spring-boot ×1

spring-webflux ×1