异步上下文响应与原始传入请求不匹配?
我们有一个带有仪表板的Web应用程序,该应用程序不断轮询更新。在服务器端,更新请求是异步的,以便我们可以在通过侦听器/通知系统进行更新时做出响应。
我们看到的问题是,当其中一个轮询请求得到响应时,在某些情况下,它可以写入用户单击链接的请求/响应。
异步更新的传入请求如下所示:
@RequestMapping("/getDashboardStatus.json")
public void getDashboardStatus(HttpServletRequest request, ...) {
final AsyncContext asyncContext = request.startAsync();
// 10 seconds
asyncContext.setTimeout(10000);
asyncContext.start(new Runnable() {
public void run() {
// .. (code here waits for an update to occur) ..
sendMostRecentDashboardJSONToResponse(asyncContext.getResponse());
if (asyncContext.getRequest().isAsyncStarted()) {
asyncContext.complete();
}
}
});
}
奇怪的是,此仪表板上有指向其他页面的链接。每大约100次点击,其中一次将不显示所选页面,而是实际显示上面发送的JSON!
例如,我们有一个单独的 MVC 方法:
@RequestMapping("/result/{resultId}")
public ModelAndView getResult(@PathVariable String resultId) {
return new ModelAndView(...);
}
当单击仪表板上访问的链接时,每个蓝月亮,该页面将加载200 OK状态,但不包含预期的HTML,实际上包含轮询请求的JSON!/result/1234
是否每个客户端只允许一个请求?由单击的链接发起的请求是否会覆盖已位于服务器端的同一客户端的任何异步请求?
我们如何管理这些请求以确保异步响应转到异步请求?
我注意到对象上有一个方法,但很难从Javadoc中理解它是否是我正在寻找的。hasOriginalRequestAndResponse()
AsyncContext
更新:我刚刚添加了一个这样的片段:
String requestURI = ((HttpServletRequest)asyncContext.getRequest()).getRequestURI());
System.out.println("Responding w/ Dashboard to: " + requestURI);
sendMostRecentDashboardJSONToResponse(asyncContext.getResponse(), clientProfileKey);
并且能够在正常行为期间重现问题,我看到:
Responding w/ Dashboard to: /app/getDashboardStatus.json
但是当我看到JSON被推送到点击发起的请求时,我看到:
Responding w/ Dashboard to: null