3

クライアント側のブラウザーからスクリプト入力を取得し、AJAX を介して Java サーブレットに送信する Web アプリケーションを作成しています。スクリプトを受け取ると、Java クラスはスクリプトを実行し、いくつかの情報を Web ページに送り返します。

私が現在テストしている Web アプリケーションの重要なコンポーネントは、接続タイムアウトと、ブラウザ接続が長時間経過した後にタイムアウトになる場合とその場合です。私にとっては、Java サーブレットが応答を送信する前に接続がタイムアウトしないことが重要です。または、少なくともタイムアウトを処理する必要があります。

これを処理する方法を調査しましたが、何をする必要があるかについて漠然とした理解がありますが、まず最初に、エラー処理なしですべてがどのように動作するかを理解するために、接続をタイムアウトにすることを試みることにしました. 昨日、クライアント側のスクリプト入力からサーブレットにコマンドを送信し、サーブレットに今朝までスリープするように指示しました。今朝戻ってきて、Chrome でサーブレットの応答が正常に受信され、ブラウザーに表示されていることがわかりました。

IE7では、それほど運がありませんでした:(

応答を15 時間以上待った後、IE7 はタイムアウトしましたが、Chrome はタイムアウトしませんでした。両方がタイムアウトするか、どちらもタイムアウトしないかのどちらかだと思いました。

また、Struts2 フレームワークを使用していることを知っておくと役立つ場合があります。

誰でもこれを説明できますか?

ありがとう!

PS私は質問の説明でできる限り詳細にしようとしましたが、追加情報を喜んで含めます. コードも含めませんでした。関連性があるとは思わなかったからです。もう一度言いますが、見たい場合は、どのコードを含めてほしいか教えてください。

4

1 に答える 1

3

Chromeは素晴らしいだけで、IEはそうではないことがわかりました(驚きです!)。これが私がかなり確信していることです:

ajax呼び出しでは、タイムアウトが設定されていないため、Chromeではタイムアウトがデフォルトで0に設定されています。つまり、タイムアウトになることはありません。

IE7は、それが(そして残念ながら私が開発しなければならない)不快なブラウザーであり、それが起こることを望まなかったので、レジストリーが設定したデフォルトのタイムアウトである60分に固執しました。

JQueryとAJAXは、このエラーの処理を少しのロングポーリング、または少なくとも私がロングポーリングであると理解していることで簡単に処理できるようにしました。これが私がしたことです:

最初のAJAXリクエスト(関数に含まれています):

$.ajax({

            beforeSend: function() {

                inUse = true;
                disableInput();

            },

            url: "executeScript.do",
            data: params,
            dataType: "text",
            type: "post",
            success: function(responseText) {

                onSuccess(responseText);

            },
            error: function(jqXHR, textStatus, errorThrown) {
                if(textStatus == "timeout") {
                    pollServlet();
                }               
            }
        });
...

ロングポーリング(?)

function pollServlet() {

var params = "testID=" + document.getElementById("testIDValue").value;

$.ajax({
    url: "servletQuery.do",
    dataType: "text",
    type: "post",
    data: params,
    success: function(response) {

        if(!isNaN(parseInt(response, 10))) {
            setTimeout(pollServlet, parseInt(response, 10));
        } else {
            onSuccess(response);
        }
    }
});

}

これはうまくいきます!しかし、私が気づいたことの1つは、IE7が「timeout」ではなく「error」のtextStatusをタイムアウトで返すことです...奇妙です!

于 2012-06-27T14:01:46.767 に答える