在将一个项目升级到 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)
所以我的问题是,如果我们不想将完整的响应正文加载到内存中,这样的示例会是什么样子。有人可以指出我正确的方向吗?