2015-12-01 21 views
6

私はJersey 2.16にアップグレードするまでは問題なく機能していたJersey StreamingOutputを使用しています。ここに事がある。私のStreamingOuputは、状況によっては出力が非常に遅くなります。私は定期的にデータを書きますが、私はそれをかなりゆっくりと少しずつ書きます。私はのOutputStreamStreamingOutput.write()に渡すと、バイトを書き込むたびに呼び出されますが、flush()は効果がないようです。 OutputStreamに8Kが書き込まれるまで、ワイヤを介して何も送信されません。残念ながら、状況によっては、8Kが書き込まれるまでにクライアントがタイムアウトしました。Jersey StreamingOutputでflush()を呼び出しても効果がありません

私はジャージのソースの一部をダウンロードし、いくつかのデバッグを通じて、私はwrite()に渡さOutputStreamCommittingOutputStreamをラップUnCloseableOutputStreamであることがわかります。

CommittingOutputStreamはバッファリングを有効にしているため、応答がコミット(完了)されるまで、flush()は本質的にno-opです。

だから、私はピクルスにいます。 StreamingOutputを使用して(または出力ストリームに直接書き込む)、応答全体が完了する前に強制的にワイヤでバイトを送信できますか?ジャージーでこれを行うための他の方法はありますか?これを行うには、私はResponseBuilderの方法を見つけることができません。私はバッファリングを無効にする方法を見つけることができません。

答えて

3

バッファーのサイズを設定するにはServerProperties.OUTBOUND_CONTENT_LENGTH_BUFFERがありますが、それを変更すると、Content-Lengthヘッダーに影響があります(それはまったく問題です)。あなたはその物件の文書を読むべきです。

サイズを決定し、HTTP "Content-Length"ヘッダーの値を設定するために、サーバー側応答エンティティをバッファするために使用されるバッファサイズを定義する整数値。

エンティティサイズが設定されたバッファサイズを超えると、バッファリングがキャンセルされ、エンティティサイズが決定されません。 0以下の値は、エンティティのバッファリングをまったく無効にします。

"jersey.config.contentLength.buffer"グローバルプロパティを使用して設定されたアウトバウンドメッセージバッファサイズ値(デフォルトまたはグローバルカスタム値)をオーバーライドするために、このプロパティをサーバー側で使用できます。

デフォルト値は8192です。

関連する問題