我尝试制作系统,接受请求,对它们进行一些操作(将相同的请求分组等),然后以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));
}
});
}
答案 0 :(得分:0)
问题不在于java代码或 AsyncContext 。 这是由Chrome缓存造成的。 Chrome停止GET请求以获得prev req响应。 No-cache选项解决了这个问题。