0

コントローラー: ポストバックを処理するコードには、長時間実行されるビズ レイヤーの db 呼び出しがあります。30 分後、ブラウザは ajax 呼び出しからのエラー メッセージを表示しましたが、db ログは db メソッドがまだ実行中であることを示していました。

じぶんの ?コントローラーで発生しなかったときにajaxエラーが発生する方法は次のとおりです[log4jはトラップされたエラーを表示しませんでした]コントローラーはまだビジネスレイヤーからのフィードバックを待っていたためです。

Tomcat でタイムアウトを調整すると効果がありますか? アプリがまだ処理中であったため、そうではないと思います

私の見解:

function runAjax(){
    $.ajax({
        type: "POST",
        url: "Test.html",
        data: { testparam1,testparam2},
        success: function(data){
            document.getElementById("processdata").innerHTML="Success";
        },
        error: function(request){
            document.getElementById("processdata").innerHTML="Error";
        }
        });
}
4

1 に答える 1

0

ブラウザー (別名 JavaScript) は、応答を永遠に待つわけではありません。しばらくすると (この場合は 30 分)、サーバーが応答していないと判断して、要求を断念します。HTTP は、少なくとも通常の手段では、30 分以上かかるリクエストを処理するようには実際には設定されていません。

いくつかのオプションがあります。まず、バックエンドで行っていることを最適化して高速化できます。つまり、クエリの実行に 30 分以上かかる場合は、SQL のアプローチを少し再考する必要があるかもしれません。

次に、単純にステップを分割して、各ステップを実行し、検証してから次のステップを実行できるようにすることができます。何をしているかによっては、これによりいくつかの作業を並行して行う可能性が開かれ、プロセスがスピードアップします。ここでの課題は、何かが失敗した場合のロールバックです。

第 3 に、Pub/Sub モデルを実装できます。JavaScript で Pub/Sub を実行するためのフレームワークがいくつかあります。私は個人的に Atmosphere を使用しました。Atmosphere には優れた jQuery プラグインがあり、ブラウザでより高度なメソッドが利用できない場合は、HTTP の従来のメソッドにフォールバックします。このモデルでは、ビューがリクエストを送信し、バックエンドが作業をキューに入れ、結果を取得するために特定のキュー/チャネルにサブスクライブするようにビューに指示します。ビューは単に応答を待つことができます。

4 つ目は、リクエストを投稿し、バックエンドが「OK、完了しました!」と言うまで JavaScript を介して単に更新し続ける中間ページを作成することです。古い W​​eb アプリケーションの多くは、実行時間の長いトランザクションに対してこれを行っていました。

使用できるオプションはおそらくあと 1000 あると思いますが、リクエストの実行に常にそれほど時間がかかる場合は、AJAX は最適なツールではないと思います。

于 2013-03-01T14:49:05.167 に答える