如何使用WebClient执行零拷贝上载和下载?
您是否可以使用org.springframework.web.reactive.function.client.WebClient
与Spring 5 WebFlux执行零拷贝上载和下载?如何使用WebClient执行零拷贝上载和下载?
你是对的,当发布基于文件的Resource
的数据时,现在支持零拷贝。
所以下面的期待权:
client.post()
.body(BodyInserters.fromResource(new FileSystemResource(new File("file.txt"))));
现在的阅读部分,零拷贝并不在Spring框架支持上的读数一侧现在;你可以在jira.spring.io上创建一个增强问题。
您的代码示例应该像:
Flux<DataBuffer> incoming = client.post()
.retrieve().bodyToMono(DataBuffer.class);
Mono<Void> writeOperation = DataBufferUtils.write(incoming, channel)
.map(DataBufferUtils::release)
.then();
// subscribe to the returned value, which will complete when writing is done
不幸的是,读取数据到DataBuffer
不会做零拷贝数据将在内存中复制。我不认为零拷贝在读取方面是支持的,所以这可能是对https://jira.spring.io的增强请求。
它缓冲整个响应吗?不缓冲导致块? 'DataBufferUtils.write(发布者
整个响应没有被缓冲,它被写入,因为反应流水线要求请求。 –
基于'BodyInserters.fromResource'的文档,听起来像下面的代码将执行零拷贝上传:'client.post()。body(BodyInserters.fromResource(new FileSystemResource(new File(“file.txt “))))'。这是否准确?下载怎么样? – CoryO
只能假设通过以下方式实现零拷贝下载:'client.post()。exchange()。doOnNext(r - > DataBufferUtils.write(r.body(BodyExtractors.toDataBuffers()),channel,0).subscribe (DataBufferUtils.releaseConsumer()))'。但是,我怎么能阻止,直到它完成消费?这甚至会执行零拷贝下载? – CoryO