如何使用WebClient执行零拷贝上载和下载?

问题描述:

您是否可以使用org.springframework.web.reactive.function.client.WebClient与Spring 5 WebFlux执行零拷贝上载和下载?如何使用WebClient执行零拷贝上载和下载?

+0

基于'BodyInserters.fromResource'的文档,听起来像下面的代码将执行零拷贝上传:'client.post()。body(BodyInserters.fromResource(new FileSystemResource(new File(“file.txt “))))'。这是否准确?下载怎么样? – CoryO

+0

只能假设通过以下方式实现零拷贝下载:'client.post()。exchange()。doOnNext(r - > DataBufferUtils.write(r.body(BodyExtractors.toDataBuffers()),channel,0).subscribe (DataBufferUtils.releaseConsumer()))'。但是,我怎么能阻止,直到它完成消费?这甚至会执行零拷贝下载? – CoryO

你是对的,当发布基于文件的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的增强请求。

+0

它缓冲整个响应吗?不缓冲导致块? 'DataBufferUtils.write(发布者,AsynchronousFileChannel,long)'的目的是什么?如果它缓冲了响应? – CoryO

+0

整个响应没有被缓冲,它被写入,因为反应流水线要求请求。 –