0

新しいデータが来るまでリクエストをサーバーに保持する必要があります。Tomcat 6 を Web サーバーとして使用しています。これが私のJQueryコードです

function sendMessage() {

    var message = $("#message").val();
    $.ajax({
        type: "POST",
        cache: false,
        url: "sendMessage.html",
        data: "message=" + message,
        dataType: "html",

        success: function(response) {

        },
        error: function(e) {
            //alert('Error: ' + e);
        },
    });
}


function startLongPolling(){

    $.ajax({
        type: "POST",
        cache: false,
        url: "LongPoll.html",
        dataType: "html",
        success: function(response) {   
            if(response != null && response !="" && response !="null")
                $("#sucess").html(response);
        },
        error: function(e) {
            //alert('Error: ' + e);
        },

        complete: function(e) {
            startLongPolling();
        },
    });
}

私のJavaコードは、

@RequestMapping(value = "LongPoll.html", method=RequestMethod.POST )
public @ResponseBody String longLongPolling(HttpSession session) {

    String sessionId = session.getId().toString();
    AgentState agentState = ApplicaionManager.agentDetail.get(sessionId);
    String message = null;

    if(ApplicaionManager.agentDetail.containsKey(sessionId)){

        while(true){

            if(agentState.isStateChange() == true){
                message = agentState.getMessage();
                if(message != null)
                    agentState.setStateChange(false);
                System.out.println("Break for session "+sessionId+" due to Agent State changed");
                break;
            }

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    System.out.println("While exited for session"+sessionId);
    return message;
}

しかし、11 秒continous request sent to serverごとに forがあります。それがどのように可能かわかりません。これをchrome developer toolsで確認しました。

ここに画像の説明を入力

私たちのスタックユーザーが私を助けてくれることを願っています.

4

1 に答える 1

2

これは正常です。ブラウザと (特に) フロントエンド サーバー (Apache/NGINX) と Web サーバー (Tomcat?) の構成に応じて、次のようになります。

  • 最初の応答の最大待機時間 (接続タイムアウト、この場合はおそらく 10 秒)
  • 完全な応答の最大待機時間

これらの設定は、基本的に、サーバーが完了しないリクエストでスパムされ、スレッド プール内のスレッドが不足するのを防ぎます。

これらの値を増やすこともできますが、常にタイムアウトを念頭に置いて、このようなコードを作成する必要があります。基本的に、クライアント側でやりたいこと:

  • ロングプルを開く
  • 応答を待ちます
  • 受け取った場合は続行
  • (タイムアウト) エラーの場合は、手順 1 に進みます。

このソリューションはスケーラブルではないことに注意してください。通常、(たとえば) 200 スレッドで受信リクエストを処理します。アイデアは、彼らが早く終わるということです。スレッド プールが使い果たされた場合、ユーザーは新しい接続を待つ必要があります。しかし、200 スレッドを使用すると、2,000 人をはるかに超えるユーザーにサービスを提供できます。ただし、プールが長いためにスレッドがブロックされている場合はそうではありません。

可能であれば、新しいバージョンの Java で利用できるようになったWebSocketsを実際に調べる必要があります。

編集Konrad が以下で提案したように、他のメカニズムに自動的にフォールバックするsocket.ioのようなものを使用できます。サーバー側で使用可能な呼び出しAtmosphereの Java ベースの実装がありますが、試したことはありません。

于 2013-09-10T09:49:25.043 に答える