2009-09-12 6 views
22

私のサーブレット(またはすべてのサーブレット)に到着したすべてのリクエストのリクエストタイムアウトをどこで設定できるのか理解しようとしていますか?それは、私の考えでは、コンテナのプロパティですか? また、これはさまざまなブラウザにどのように影響しますか?それらはすべて、コンテナが指示するパラメータに従っていますか? リクエストのタイムアウト時間は、私が制御できるものでもなく、各ブラウザが独自にこれを決めているかもしれません。 (セッションのタイムアウトについては話していません)JavaサーブレットコンテナのHttp Request timeoutパラメータ

+1

良い質問。私は最後の答えにあなたのコメントを読んで、私はどのようなアプローチがあなたの要求が閉じていないことを確認することを選択したのだろうかと思っていた。私は自分自身を彗星にしようとしており、この権利をどうやって作るのか分からない。あなたは解決策を提案できますか?ありがとう! – Dragos

+0

@Dragos〜29秒後に要求をユーザーに返す単純なロングポーリングメカニズムを実装しました(これは30秒未満です[IEの制限])。私が今同じ問題に直面していたら、ウェブソケットapiを使用しようとしていました。 – Ittai

+0

ここでは、「at x time」が現在のレスポンスをフラッシュして現在のスレッドを強制終了するようなタイムアウトを探しているので、ブラウザはデータをすばやく受信します。 FWIWブラウザは最近、レスポンスで「何分」待っているようです... – rogerdpack

答えて

14

クライアントからのタイムアウト(つまりHTTPリクエストへの応答を待つ時間)はクライアント側で決まります。 IEの場合はthis、Firefoxの場合はthisを参照してください。

このタイムアウトをサーバーから制御することはできません。

+0

最初に返信いただきありがとうございます。クライアント側(JavaScript経由)でプログラムで変更することはできません。 – Ittai

+0

私はそう信じていません。 –

2

クライアントのタイムアウトをサーバーから制御することはできません。ただし、長時間実行されている操作がビジーである間は、毎回クライアントにデータを返すことができます。これにより、クライアントのタイムアウトを防ぐことができ、ユーザーなどに進捗状況を表示することができます。レスポンスから取得したOutputStreamまたはWriterにデータを書き込み、flushを呼び出してクライアントに部分データを送信します。

+0

xmlHttpRequestを使用している場合、この部分データはどのように取得できますか? 私はIEよりも読んだことがあります。要求が完了するまでデータにアクセスすることはできません。 – Ittai

+1

はい、データが入っている間はクライアントはタイムアウトしてはなりません。 –

+0

あなたは正しいですが、私はCometを実装しているので、「Long Polling」を使用するので、要求を保存するためにはより長いタイムアウトが必要になるか、Davidが提案していたストリーミングを使用します。とにかくありがとうございました。 – Ittai

5

あなたは、クライアントのタイムアウトを制御することはできませんにもかかわらず、サーバーが非常にせっかちすることができます:)たとえば、Tomcat上で、あなたのコネクターでこれを行うことができますが、

<Connector port="8080" 
    ... 
    connectionTimeout ="5000" 
    disableUploadTimeout="false" /> 

これは、サーバーがわずか5秒待ってます接続を閉じます。ブラウザが接続を閉じたエラーを表示します。クライアントでタイムアウトと同じように扱うことができます。

もちろん、これはタイムアウトがサーバーによって引き起こされたもので、ブラウザとサーバーの間の接続の問題ではない場合にのみ機能します。

+0

"timeout" Tomcat Connectorにこのようなパラメータはありません – robsf

+2

パラメータ名は、Connectorタグ内のconnectionTimeoutです。