Java Servlet 3.0维护版本(第34页)内容如下:
A call to this method – ServletRequest.startAsync(ServletRequest req,
ServletResponse res) – ensures that the response isn’t committed when
the application exits out of the service method. It is committed when
AsyncContext.complete is called on the returned AsyncContext or the
AsyncContext times out and there are no listeners associated to handle
the time out. The timer for async time outs will not start until the
request and it’s associated response have returned from the container.
The AsyncContext could be used to write to the response from the async
thread. It can also be used to just notify that the response is not
closed and committed.
In the event that an asynchronous operation has timed out, the
container must run through these steps:
Invoke, at their onTimeout method, all AsyncListener instances registered with the ServletRequest on which the asynchronous operation
was initiated.
If none of the listeners called complete() or any of the dispatch() methods, perform an error dispatch with a status code equal
to HttpServletResponse.SC_INTERNAL_SERVER_ERROR.
If no matching error page was found, or the error page did not call complete() or any of the dispatch() methods, call complete().”
上面的最后一行是最重要的 – 将调用AsyncContext.complete(). The javadoc says:
Completes the asynchronous operation that was started on the request
that was used to initialze this AsyncContext, closing the response
that was used to initialize this AsyncContext.
关闭AsyncContext后,对其大多数方法的调用将抛出IllegalStateException.