【问题标题】:Making an AJAX POST on websocket message is causing timeout exceptions在 websocket 消息上进行 AJAX POST 会导致超时异常
【发布时间】:2024-01-31 01:40:01
【问题描述】:

所以我有一个程序,它基本上允许两个用户来回聊天,并通过 websocket 使用 javascript 和 java 服务器端点做其他事情。当其中一个用户按下按钮时,我有一个监听器,它会向调用函数的另一个用户发出消息。在此功能期间,我希望能够使用 JQuery 调用 AJAX POST 来更新我的数据库,但这会导致 java.util.concurrent.TimeoutException。知道为什么会这样吗?我想这与 websocket 连接没有保持打开足够长的时间以使 ajax 调用通过这一事实有关。

所以我已经完成了研究,我发现 websocket 和 AJAX 并不完全应该混合使用(我认为)。但是,即使更新我的数据库,我似乎也找不到替代方法。有很多代码,所以我会尝试只发布重要的部分。

这是按下按钮时的代码部分(这是一个同意按钮,因此两个用户都必须按下它,因此有 '**' 和 '--' 字符)。

        fAgree.addEventListener("click", function() {
        // selects this button
        if (aStr == "**" && (yStr == "**" || oStr == "**")) {
            if (fStr == "--") {
                fStr = "*-";

                //redirect to another page
            } else if (fStr == "-*") {
                fStr = "**";


            if(secondTransaction == false) {
                    var firstCoordUpload = document.getElementById("yourPos").innerHTML;
                    var secondCoordUpload = document.getElementById("othersPos").innerHTML;
                    var firstLatUpload = parseFloat(firstCoordUpload.split(",")[0]);
                    var firstLonUpload = parseFloat(firstCoordUpload.split(",")[1]);

                    $.ajax({
                        url: "../../309/T11/setSaleData/" + getURLParameter("saleID") + "/" + firstLatUpload + "/" + firstLonUpload + "/" + firstCoordUpload + "/" + secondCoordUpload + "/" + secondSeller,
                        type: "POST",
                        headers: {
                            "Authorization" : getCredentials(),
                        },
                        success: function (result) {
                            window.location.href = '../../frontEnd/profilePage/index.html?username='+ getUsername();
                            console.log(result);
                        },
                        error: function (dc, status, err) {
                            console.log(err);
                            console.log(status);
                        }
                    });                     

            }



            }
            agreeBut.socket.send("a,f");
            htmlChange(fStr, fStar);
        }
    });

这是在上述代码末尾调用的部分代码(agreeBut.socket.send())。

    agreeBut.socket.onmessage = function(message) {
    // check [0]: a for agree buttons,
    // m for map,
    // l of location buttons,
    // t for trade
    var mess = message.data.split(",");
    if (mess[0] == "a") {
        // second a shows the agree button was pressed, changes aStr
        // accordingly and displays
        if (mess[1] == "a") {
            if (aStr == "--") {
                aStr = "-*";
            } else if (aStr == "*-") {
                aStr = "**";
            }
            htmlChange(aStr, aStar);

            // shows the final agree button has been pressed, changes fStr
            // accordingly and displays
        } else if (mess[1] == "f") {
            if (fStr == "--") {
                fStr = "-*";
                //redirect
            } else if (fStr == "*-") {
                fStr = "**";

                alert("on this");
                if(secondTransaction == true) {

                        alert("doing it");
                        var firstCoordUpload = document.getElementById("yourPos").innerHTML;
                        var secondCoordUpload = document.getElementById("othersPos").innerHTML;
                        var firstLatUpload = parseFloat(firstCoordUpload.split(",")[0]);
                        var firstLonUpload = parseFloat(firstCoordUpload.split(",")[1]);

                        $.ajax({
                            url: "../../309/T11/setSaleData/" + getURLParameter("saleID") + "/" + firstLatUpload + "/" + firstLonUpload + "/" + firstCoordUpload + "/" + secondCoordUpload + "/" + secondSeller,
                            type: "POST",
                            headers: {
                                "Authorization" : getCredentials(),
                            },
                            success: function (result) {
                                console.log(result);
                                alert("Got it");
                                window.location.href = '../../frontEnd/profilePage/index.html?username='+ getUsername(); 
                            },
                            error: function (dc, status, err) {
                                console.log(err);
                                console.log(status);
                            }
                        });                     

                }



                //window.location.href = '../../frontEnd/profilePage/index.html?username='+ getUsername();
            }
            htmlChange(fStr, fStar);
        }

    }

};

【问题讨论】:

    标签: java javascript jquery ajax websocket


    【解决方案1】:

    事实证明我遇到了这个问题,因为我的 java ServerEndpoint 上设置了超时。在课程中,我在会话变量上使用了 setMaxIdleTimeout(0) 函数来避免空闲超时。这似乎解决了我的问题(但我觉得这实际上只是我端糟糕的 websocket 和 ajax 实现的一种解决方法)。

    【讨论】: