2017-05-15 12 views
0

私は、Writerに直接書き込むSpring MVCコントローラを持っています。SpringブートでOutputStream/Writerを強制的にフラッシュする方法

@GetMapping("/delay") 
void delay(final java.io.Writer writer) throws IOException, InterruptedException { 
    for (int i = 0; i < 10000; i++) { 
     writer.write(String.valueOf(i)); 
     writer.write(","); 
     writer.flush(); 

     Thread.sleep(10); 
    } 
} 

私はcurlを使用してこのメ​​ソッドを呼び出すと、すべてのループの繰り返しでflush()を呼び出すにもかかわらず、Writerが1024のバイトが書かれている場合にのみフラッシュされるようです。すべてのループ反復でWriterを強制的にフラッシュする方法はありますか?

+0

'Writer'クラス(またはインターフェイス)の完全な名前は何ですか?私はそれを見つけるように見えない。とにかく、1024バイトごとにしかフラッシュしないBufferedOutputStreamをラップするかもしれません(しかし、強制的にフラッシュする方法があるはずです)。 –

+0

@JeremyGrandはい、それは 'java.io.Writer'です。 –

+0

flush()は、基になる 'org.apache.catalina.connector.CoyoteWriter'と' org.apache.catalina.connector.OutputBuffer'に正しく伝播されますが、1kのデータが書き込まれるまで応答は返されません応答 –

答えて

0

それは、キャッシングをしていたcurl、オプション--no-buffer-N)だったようだが、出力ストリームのバッファリングを無効にします。

0

CoyoteWriterフラッシングがうまく動作するようです。適切な単体テストは、コントローラをCurlで呼び出すことをより説得力のあるものにするでしょう。

私はカールとウェブブラウザの両方であなたのコードをテストしましたが、本当にカールはレスポンスを大量に出力していましたが、ブラウザはレスポンスを書き込んでいる間は正しく読み込んでいます。

関連する問題