2017-10-14 193 views
0

您是否可以使用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

回答

1

你是對的,當發佈基於文件的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

整個響應沒有被緩衝,它被寫入,因爲反應流水線要求請求。 –