簡體   English   中英

在JQuery + JAVA中長時間輪詢?

[英]Long polling in JQuery + JAVA?

我需要在服務器中 保留我的請求,直到新數據出現。我使用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 我不知道怎么可能。 我用chrome開發人員工具檢查過這個。

在此輸入圖像描述

希望我們的堆棧用戶能幫助我。

這是正常/預期的。 根據您的瀏覽器和(特別是)前端服務器(Apache / NGINX)和Web服務器(Tomcat?)配置,您將擁有:

  • 第一個響應的最長等待時間(連接超時,在您的情況下可能是10秒)
  • 完整響應的最長等待時間

這些設置基本上可以防止服務器因永遠不會完成和耗盡線程池中的線程的請求而被垃圾郵件發送。

您可以增加這些值,但是您應該始終在創建代碼時考慮到超時。 基本上你想在客戶端做:

  • 打開長拉
  • 等待回應
  • 如果收到,繼續
  • 如果(超時)錯誤,請轉到步驟1

請注意,此解決方案不可擴展:通常您將(例如)200個線程處理傳入請求。 他們的想法是他們快速完成。 如果線程池耗盡,則用戶必須等待新連接。 但是使用200個線程,您可以為超過2.000個用戶提供服務。 但是如果由於長池而導致線程被阻塞則不行。

如果可能的話,你應該真正研究WebSockets ,它現在可以在新版本的Java中使用。

編輯正如Konrad在下面建議的那樣,你可以使用類似socket.io的東西,它可以自動回退到其他機制。 有一個基於Java的實現服務器端可用呼叫Atmosphere ,但我還沒有嘗試過。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM