2017-10-14 3 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

File-based Resourceからデータを投稿するときはゼロコピーがサポートされています。

ので、以下では右になります。

今読取部のために、ゼロコピーは春Frameworkで今読み出し側ではサポートされていません
client.post() 
     .body(BodyInserters.fromResource(new FileSystemResource(new File("file.txt")))); 

。そのためにjira.spring.ioの拡張問題を作成することができます。

あなたのコードサンプルは、次のようになります。データがメモリにコピーされるようDataBufferにデータの読み取りがゼロコピーを行うことはありません、残念ながら

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 

。私はゼロコピーが読書側で知っていることを知っているとは思わないので、これはhttps://jira.spring.ioの強化要求かもしれません。

+0

応答全体をバッファリングしますか?バッファリングがブロックを引き起こさないか?応答をバッファリングする場合、 'DataBufferUtils.write(Publisher 、AsynchronousFileChannel、long)'の目的は何ですか? – CoryO

+0

応答全体がバッファリングされていません。反応パイプラインによって要求が要求されるたびに書き込まれます。 –

関連する問題