java - JQuery + JAVA 中的长轮询?

标签 java jquery spring google-chrome-devtools long-polling

我需要在服务器保留我的请求,直到有新数据到来。我使用Tomcat 6作为我的网络服务器。这是我的 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秒就会有一个连续请求发送到服务器。我不知道这怎么可能。我已经使用 chrome 开发者工具检查了这一点。

enter image description here

希望我们的堆栈用户能够帮助我。

最佳答案

这是正常/预期的。根据您的浏览器和(特别是)前端服务器(Apache/NGINX)和 Web 服务器(Tomcat?)配置,您将拥有:

  • 首次响应的最长等待时间(连接超时,在您的情况下可能为 10 秒)
  • 完整响应的最长等待时间

这些设置基本上可以防止服务器收到从未完成的请求以及线程池中线程耗尽的垃圾邮件。

您可以增加这些值,但是您应该始终在创建代码时考虑到超时。基本上你想在客户端做:

  • 打开长拉
  • 等待回复
  • 如果收到,请继续
  • 如果(超时)错误,请转到步骤 1

请注意,此解决方案不可扩展:通常您会有(例如)200 个线程处理传入请求。他们的想法是他们能很快完成。如果线程池耗尽,用户将不得不等待新的连接。但有了 200 个线程,您就可以为超过 2000 个用户提供服务。但如果线程由于长池而被阻塞,则不会。

如果可能的话,你真的应该研究一下 WebSockets ,现在在新版本的 Java 中可用。

编辑 正如 Konrad 下面所建议的,您可以使用类似 socket.io 的内容。 ,它会自动回退到其他机制。有一个基于 Java 的服务器端可用调用实现 Atmosphere ,不过我还没试过。

关于java - JQuery + JAVA 中的长轮询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18715277/

相关文章:

java - SharedPreferences 不会发送位图 : Failed to allocate memory

java - JVM/CLR 源代码兼容语言选项

java - 非基于套接字的 Java 服务器

jquery - 如果我有一个值数组,如何选中复选框?

java - 从 Try-Catch 中获取字符串

jquery - 带有 jQ​​uery UI 对话框的 CKEditor、拼写检查和按钮在第二次单击时不起作用

php - Ajax Post 到 PHP 返回空数组

java - Spring 数据库负载测试 : How to release connections

java - model和view内部redirect和redirect的区别

Spring 的 LoadTimeWeaver 代理未启动