- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我们有一个带有仪表板的 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(...);
}
当点击仪表板上访问 /result/1234
的链接时,每个蓝月亮,页面将加载 200 OK 状态,但不包含预期的 HTML,实际上包含轮询请求的 JSON!
每个客户端只允许一个请求吗?由单击的链接发起的请求是否会覆盖来自同一客户端的任何已经位于服务器端的异步请求?
我们如何管理这些请求以确保异步响应发送到 async 请求?
我注意到 AsyncContext
对象上有一个 hasOriginalRequestAndResponse()
方法,但我很难从 Javadoc 中理解它是否是我正在寻找的。
更新:我刚刚添加了一个这样的片段:
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
最佳答案
我已经弄清楚了这一点。请求/响应 确实被回收了,所以通过卡在分配给 AsyncContext
的响应上,我正在写出与 关联的响应不同的请求。
调用 startAsync()
保证请求/响应对象在异步上下文完成之前不会被回收。尽管我发现没有地方会过早或错误地完成上下文,但它正在完成:
超时。
在没有服务器端 Activity 的情况下等待 10 多秒,让 JSON 更新请求超时,然后然后单击链接,我能够始终如一地重现此问题。超时后,与异步上下文相关的请求/响应超时,从而完成,从而回收。
我发现了两个解决方案。
首先是在上下文中添加一个AsyncListener
,并跟踪是否发生了超时。当您的监听器检测到超时时,您会翻转一个 boolean
,并在写入响应之前对其进行检查。
second 是在写入响应之前对请求简单地调用 isAsyncStarted()
。如果上下文超时,此方法将返回 false
。如果上下文仍然有效/等待,它将返回 true
。
关于java - AsyncContext 响应与原始传入请求不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27711105/
我有点困惑 servlet 容器如何在应用程序取消部署阶段或只是超时终止 AsyncContext。例如应用程序开发人员有以下代码片段: @WebServlet(name = "MyServlet",
我们有一个带有仪表板的 Web 应用程序,它不断地轮询更新。在服务器端,更新请求是异步的,因此我们可以通过监听器/通知系统在发生更新时做出响应。 我们看到的问题是,当其中一个轮询请求得到响应时,在某些
关于:AsyncContextThread https://github.com/StephenCleary/AsyncEx/wiki/AsyncContext https://github.com/
首先我想说英语不是我的母语,所以如果我犯了一些明显的错误或者有些地方不够清晰,请原谅。问题: 最近我被转移到一个新项目,我们正在开发一个 Java EE 应用程序,该应用程序通过 Jersey+Hib
虽然 Servlet 3.0 规范有 request.startAsync() 和 asyncContext.start(),为什么它没有提供 asyncContext.stop() 或 asyncC
我正在使用 Spring 的 OncePerRequestFilter 覆盖 shouldNotFilterAsyncDispatch 方法以返回 false。这样它就可以处理异步请求。在过滤器中,我
我目前正在学习网站编程,准确地说是使用 javascript 的 java servlet,我刚刚学习了如何在单个 servlet 中使用 AsyncContext。例如,我想知道是否可以在 serv
我关注了this教程并实现了一个简单的聊天应用程序。我正在最新的 Mozilla Firefox 和 Google Chrome 浏览器中对其进行测试。 我主要担心的是消息交换似乎不是实时发生的。即使
我在我的控制台应用程序中调用一个异步方法。我不希望应用程序在启动后不久退出,即在等待任务完成之前退出。看来我可以这样做: internal static void Main(string[] args
我几乎可以肯定,但最好澄清一下:如果 Runnable 在 servlet 请求的 AsyncContext 中启动,那么代码是在run方法线程安全吗?我想是的。因为每个线程都有一个新的 Runnab
我正在使用 Servlet 3.0 的 javax.servlet.AsyncContext 实现服务器发送的事件界面。 但是我不明白我应该如何处理 I/O 错误,例如 peer disconnect
我创建了一个 servlet 3.0 来探索异步请求处理: @WebServlet(name="MyTest", urlPatterns={"/MyTest"}, asyncSupported=tru
AsyncContext 的文档有这个同步工作的例子(只是稍微修改,但仍然有效): #include "napi.h" void MakeCallbackWithAsyncContext(const
当我们使用 servlet3 规范中提到的 AsyncContext 时,http 连接保持打开状态多长时间?我的一段代码是 final AsyncContext asyncContext = htt
我需要 Web/JavaEE 容器中的一个线程来从外部源获取信息并在同一 JVM 中完成相应的 AsyncContext 对象。 我希望有一个零延迟的解决方案,因此排除了定期轮询或计时器。 我可以启动
我点击了链接 http://wiki.eclipse.org/Jetty/Tutorial/Jetty_HelloWorld教程(使用 Eclipse)。并查看了现有的 stackoverflow h
我正在使用 intellij idea 终极版 12..4 Grails 2.2.0 , buildConfig.groovy 文件中的 grails.servlet.version = "2.5"
我正在尝试遵循http://wiki.eclipse.org/Jetty/Tutorial/Jetty_HelloWorld教程(使用 Eclipse)。该项目编译良好。但是,当我访问本地主机服务器时
我已成功运行 Java servlet 应用程序测试,该应用程序在 Amazon AWS Elastic BeansTalk 提供的基本示例应用程序上运行。 Java-Gradle-Jetty 平台。
以此处回答的几个示例和问题为主导(主要是 http://www.javaworld.com/javaworld/jw-02-2009/jw-02-servlet3.html?page=3 ),我想让服
我是一名优秀的程序员,十分优秀!