Java servlet异步上下文阻止其他请求

时间:2017-10-10 07:49:12

标签: java servlets

我尝试制作系统,接受请求,对它们进行一些操作(将相同的请求分组等),然后以1-2秒的延迟发送响应。

所以我尝试使用 AsyncContext 来防止立即发送响应并在需要时发送它们。

但是当我使用 AsyncContext 时,它会阻止下一个响应,而第一个响应没有完成。 对于测试,我一次发送3个ajax get请求

因此,我的代码不会处理3个未完成的请求,而是等到第一个请求完成,然后使用第二个,而第三个等待直到第二个请求完成。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    System.out.println("GET " + new Date().toString());

    if(!request.getRequestURL().toString().contains("localhost")) {
        try {

            AsyncContext context = request.startAsync();

            context.start(new Runnable() {
                @Override
                public void run () {

                    try {

                        prepare(request, response);
                        addToPool(request, response, context);

                        System.out.println("fin GET " + new Date().toString());

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });

        }  catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

在日志中,它看起来像这样:

GET Tue Oct 10 10:16:25
Try combine: false
Req added to waitlist
fin GET Tue Oct 10 10:16:25
Completed

GET Tue Oct 10 10:16:30
Try combine: false
Req added to waitlist
fin GET Tue Oct 10 10:16:30
Completed

GET Tue Oct 10 10:16:35
Try combine: false
Req added to waitlist
fin GET Tue Oct 10 10:16:35
Completed

AsyncContext 应该这样做,还是我做错了什么?

P.S。 我尝试使用 AsyncContext 而不使用“context.start(new Runnable(){...”并获得相同的结果。

更新 - JS代码。我在按钮点击事件上调用 multiReq

function multiReq() {
    getCurrAcc();
    getCurrAcc();
    getCurrAcc();
}

function getCurrAcc() {

    $.ajax({
        type: "GET",
        contentType: 'application/json',
        url: "http://new59d2023b5d1a4.amocrm.ru.myhost.localarea.local/private/api/v2/json/accounts/current",
        xhrFields: {
            withCredentials: true
        },
        success: function (data) {
            alert(JSON.stringify(data));
        },
        error: function (request, status, error) {

            alert(JSON.stringify(request));
        }
    });
}

1 个答案:

答案 0 :(得分:0)

问题不在于java代码或 AsyncContext 。 这是由Chrome缓存造成的。 Chrome停止GET请求以获得prev req响应。 No-cache选项解决了这个问题。