AsyncContext超时后的确切行为是什么?它是否仍然运行并使用getResponse()返回响应?
答案 0 :(得分:7)
Java Servlet 3.0 维护版本(第34页)显示:
对此方法的调用 -
ServletRequest.startAsync(ServletRequest req, ServletResponse res)
- 确保在何时未提交响应 应用程序退出服务方法。它承诺时 在返回的AsyncContext或。上调用AsyncContext.complete AsyncContext超时,并且没有关联的侦听器 超时异步超时的计时器直到 请求和它的相关响应已从容器返回。 AsyncContext可用于从异步中写入响应 线。它也可以用于通知响应不是 关闭并承诺。
来自the javadoc of the javax.servlet.AsyncContext interface:
如果异步操作超时,则 容器必须执行以下步骤:
- 在他们的onTimeout方法中调用所有在ServletRequest上注册的异步操作的AsyncListener实例 发起了。
- 如果没有任何侦听器调用complete()或任何dispatch()方法,请执行状态代码相等的错误调度 到HttpServletResponse.SC_INTERNAL_SERVER_ERROR。
- 如果未找到匹配的错误页面,或者错误页面未调用complete()或任何dispatch()方法,请调用complete()。“
醇>
上面的最后一行是最重要的 - 会打电话给AsyncContext.complete()
。 The javadoc says:
完成对请求启动的异步操作 用于初始化此AsyncContext,关闭响应 用于初始化此AsyncContext。
关闭AsyncContext
后,对其大多数方法的调用将抛出IllegalStateException
。