2011-09-09 9 views
0

私は、世代時間が200以上であるかどうかを検出するフィルタをjavaに用意しています。キャッシュ制御ヘッダーを特定の時間に設定します。どのように応答します.setHeaderは動作しますか?

これは、サーバの負荷を軽減するために行われています。

私はそれについての疑いを持っている:

は、レスポンスヘッダの一部を書き込む前に、身体を書くとき、万が一、より多くのメモリを使用してserlvetのcontainterですか?

resp.write()を実行しているときに、サーブレットコンテナ(tomcatなど)が接続にデータを書き込むことはできますか?

メモリの問題が心配です。私は、レスポンスが完了してからサーブレットコンテナが書き出しを開始するまで、バッファなしですべてのレスポンスを生成するために余分なメモリを使用する可能性があると思います。

+0

ほとんどのJavaアプリケーションサーバーは、しきい値に達するまで出力をバッファし、バッファをクライアントにフラッシュします。すべてのHTTPヘッダーが出力されるまで、HTTP本体は出力できません。それがHTTPの仕組みです。 –

+0

@paul:スレッシュホールドに達してバッファがフラッシュされ、resp.setHeader()を実行するとどうなりますか?例外? – user2427

+0

それはまた、アプリケーションサーバーによって異なります。私の経験はWebSphereであり、そのアプリケーション・サーバーは、そのアプローチをIllegalStateExceptionのスローから警告のロギング(http://www-01.ibm.com/support/docview.wss?uid=swg1PQ97899)に変更しました。 –

答えて

0

これはアプリケーションコンテナによって異なりますが、これは絶対にメモリ使用量に大きな影響を与えません。応答を書く際のバッファサイズが問題であれば、Javaはおそらくあなたのためのプラットフォームではありません。

ハードウェアを上げてプラットフォームを放棄します。メモリ使用の問題がある場合は、間違った場所を探している可能性があります。

0

MISUNDERSTANDING:200ミリ秒待機していたスレッドがあったと思って、まだ何も起こっていないときにヘッダーを書き込んでいました。ケース(応答生成の終了に書き込まれるヘッダ)ではありません。そのような場合には以下の問題がありますが、私はあなたが本当に欲しいものに答えるためにもう一度お試しになります。


私はサーブレットでスレッドセーフであることを意味する「応答」を信じていない - 私は理解していた場合、「200を待ってます(補足のスレッドで応答変数にデータを書き込もうとはなりませんミリ秒 "ロジック)を要求します。

フィルターが "ヘッダー"を書き込む前に、応答の一部がフラッシュされるという問題に加えて、データが単に失われたり、認識できないだけで文字化けしたりすることがあります。

しかし、フィルタで応答のラッパーを提供することができます。ラッパークラスをスレッドセーフにし、出力をバッファーにします。 の場合は、200ミリ秒後に応答バッファに何かがあるかどうかを確認し(同期したアトミックな方法で)、そうでない場合は適切なフラグを付けます。

+0

が別のスレッドに存在せず、要求をラップするフィルタ内にあります。 – user2427

0

バッファサイズをに設定する代わりに、が「無限大」である場合は、応答実装のラッパーとして動的プロキシ/呼び出しハンドラのペアを作成する方がよい場合があります。

http://www.javaworld.com/javaworld/jw-11-2000/jw-1110-proxy.html

あなたのフィルタが呼び出しハンドラを作成し、実際のレスポンスの実装の代わりに、チェーン内の後続のフィルタ/サーブレットに渡す動的プロキシ、中にそれを置く参照してください。

チェーンのより深いものが返ってきたら、必要に応じてヘッダーを生成し、ヘッダーの後に本文を書き込むことができるように、バッファされたデータをプロキシから取得します。

はい、メモリを使用します。あまりにも心配するとは言いません。アプリケーションが20 MBの「ページ」を返した場合は、それを問題の1つとして扱うことができます。

関連する問題