AsyncContext 超时后的确切行为是什么?它是否仍在运行并且是否使用 getResponse() 返回响应?
问问题
3338 次
1 回答
7
Java Servlet 3.0维护版本(第 34 页)内容如下:
调用此方法 -
ServletRequest.startAsync(ServletRequest req, ServletResponse res)
- 确保在应用程序退出服务方法时不会提交响应。当在返回的 AsyncContext 上调用 AsyncContext.complete 或 AsyncContext 超时并且没有关联的侦听器来处理超时时,将提交它。在请求及其相关响应从容器返回之前,异步超时计时器不会启动。AsyncContext 可用于写入来自异步线程的响应。它也可以用来通知响应没有关闭和提交。
从javax.servlet.AsyncContext 接口的 javadoc:
如果异步操作超时,容器必须运行以下步骤:
- 在它们的 onTimeout 方法中调用所有向启动异步操作的 ServletRequest 注册的 AsyncListener 实例。
- 如果没有任何侦听器调用 complete() 或任何 dispatch() 方法,则执行错误分派,状态码等于 HttpServletResponse.SC_INTERNAL_SERVER_ERROR。
- 如果没有找到匹配的错误页面,或者错误页面没有调用 complete() 或任何 dispatch() 方法,请调用 complete()。”
上面的最后一行是最重要的 - 将调用AsyncContext.complete()
. javadoc 说:
完成对用于初始化此 AsyncContext 的请求启动的异步操作,关闭用于初始化此 AsyncContext 的响应。
With AsyncContext
closed, calls to most of its methods will throw IllegalStateException
.
于 2013-03-17T05:59:39.993 回答