小编Spu*_*man的帖子

Spring Webflux 使用 DataBuffer 将 WebClient.exchange() 迁移到 WebClient.exchangeToMono()

在将一个项目升级到 spring webflux 5.3.3 时,我注意到 Webclient.exchange 方法已被弃用(链接)。

我已经阅读了问题Spring WebFlux 5.3.0 - WebClient.exchangeToMono()并且我有一个关于使用 DataBuffer 以及如何在 .exchangeToMono() 中使用它们的问题。

到目前为止,我了解到新方法 WebClient.exchangeToMono() 和 .exchangeToFlux() 强制开发人员应该处理其中的请求主体,因为 spring webflux 的下一步是释放整个响应主体。

为了使我的基本问题更加明显,让我们假设我们想要创建一个代理,将所有内容传递给调用者。这可能看起来像:

.exchangeToMono { clientResp ->
   val statusCode = clientResponse.statusCode()
   val respHeaders = clientResponse.headers().asHttpHeaders()
   val body = clientResponse.body(BodyExtractors.toDataBuffers())
      .doOnEach {
         if (it.isOnComplete || it.isOnError) {
            it.get()?.let { buffer ->
               DataBufferUtils.release(buffer)
            }
         }
      }
   ServerResponse.status(statusCode)
      .headers { headers -> headers.addAll(respHeaders) }
      .body(BodyInserters.fromDataBuffers(body))
}
Run Code Online (Sandbox Code Playgroud)

但是,此代码片段不起作用,因为只有在有人订阅整个链时才会读取正文,但在 .exchangeToMono() 方法之后,响应正文将立即被释放,从而导致which.releaseIfNotConsumed()调用。response.releaseBody()body(BodyExtractors.toDataBuffers()).map(DataBufferUtils::release)

所以我的问题是,如果我们不想将完整的响应正文加载到内存中,这样的示例会是什么样子。有人可以指出我正确的方向吗?

spring-webflux spring-webclient

6
推荐指数
0
解决办法
2723
查看次数

标签 统计

spring-webclient ×1

spring-webflux ×1