超时后JavaEE 6 AsyncContext行为

时间:2013-03-16 09:32:57

标签: java-ee asynchronous

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

1 个答案:

答案 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

  

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

     
      
  1. 在他们的onTimeout方法中调用所有在ServletRequest上注册的异步操作的AsyncListener实例   发起了。
  2.   
  3. 如果没有任何侦听器调用complete()或任何dispatch()方法,请执行状态代码相等的错误调度   到HttpServletResponse.SC_INTERNAL_SERVER_ERROR。
  4.   
  5. 如果未找到匹配的错误页面,或者错误页面未调用complete()或任何dispatch()方法,请调用complete()。“
  6.   

上面的最后一行是最重要的 - 会打电话给AsyncContext.complete()The javadoc says

  

完成对请求启动的异步操作   用于初始化此AsyncContext,关闭响应   用于初始化此AsyncContext。

关闭AsyncContext后,对其大多数方法的调用将抛出IllegalStateException