栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

首先,让我指出,

Flux.fromIterable(items)
仅当
items
从内存中获取使用建议,不涉及I /
O。否则,您可能会使用阻塞API来获取它-
这会破坏您的响应式应用程序。在这种情况下,这是一个内存列表,所以没有问题。请注意,您也可以去
Flux.just(item1, item2,item3)

使用以下内容是最有效的:

@GetMapping("/")public Flux<Item> findFlux() {  return webClient.get()    .retrieve()    .bodyToFlux(Item.class);}

Item
实例将以非常有效的方式即时读取/写入,解码/编码。

另一方面,这不是首选方法:

@GetMapping("/block")public List<Item> findBlock() {  return webClient.get()    .retrieve()    .bodyToFlux(Item.class)    .collectList()    .block(Duration.ofSeconds(10L));}

在这种情况下,您的前台应用程序 将整个项目列表 缓存在内存

collectList
但同时也会阻塞少数可用的服务器线程之一。这可能会导致性能很差,因为您的服务器可能被阻止等待该数据,并且无法同时处理其他请求。

在这种情况下,情况变得更糟,因为应用程序完全崩溃了。查看控制台,我们可以看到以下内容:

WARN 3075 --- [ctor-http-nio-7] io.netty.util.concurrent.DefaultPromise  : An exception was thrown by reactor.ipc.netty.channel.PooledClientContextHandler$$Lambda$532/356589024.operationComplete()reactor.core.Exceptions$BubblingException: java.lang.IllegalArgumentException: Channel [id: 0xab15f050, L:/127.0.0.1:59350 - R:localhost/127.0.0.1:8081] was not acquired from this ChannelPool    at reactor.core.Exceptions.bubble(Exceptions.java:154) ~[reactor-core-3.1.3.RELEASE.jar:3.1.3.RELEASE]

这可能与应在0​​.7.4.RELEASE中修复的反应堆网络客户端连接池问题有关。我不知道具体细节,但是我怀疑整个连接池都被破坏了,因为没有从客户端连接中正确读取HTTP响应。

添加

spring-boot-starter-web
的确使您的应用程序使用Tomcat,但是主要是将Spring WebFlux应用程序转换为Spring
MVC应用程序(现在支持某些反应式返回类型,但是具有不同的运行时模型)。如果希望使用Tomcat测试应用程序,则可以将其添加
spring-boot-starter-tomcat
到POM中,这将结合使用Tomcat和Spring WebFlux。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/647703.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号