9

AsyncContext 超时后的确切行为是什么?它是否仍在运行并且是否使用 getResponse() 返回响应?

4

1 回答 1

7

Java Servlet 3.0维护版本(第 34 页)内容如下:

调用此方法 - ServletRequest.startAsync(ServletRequest req, ServletResponse res)- 确保在应用程序退出服务方法时不会提交响应。当在返回的 AsyncContext 上调用 AsyncContext.complete 或 AsyncContext 超时并且没有关联的侦听器来处理超时时,将提交它。在请求及其相关响应从容器返回之前,异步超时计时器不会启动。AsyncContext 可用于写入来自异步线程的响应。它也可以用来通知响应没有关闭和提交。

javax.servlet.AsyncContext 接口的 javadoc

如果异步操作超时,容器必须运行以下步骤:

  1. 在它们的 onTimeout 方法中调用所有向启动异步操作的 ServletRequest 注册的 AsyncListener 实例。
  2. 如果没有任何侦听器调用 complete() 或任何 dispatch() 方法,则执行错误分派,状态码等于 HttpServletResponse.SC_INTERNAL_SERVER_ERROR。
  3. 如果没有找到匹配的错误页面,或者错误页面没有调用 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 回答