On 05/05/2013 13:18, Rossen Stoyanchev wrote: > > When a request has been put into async mode (via request.startAsync), > the response may remain open long after the initial container thread > has exited. Meanwhile a non-container thread is allowed to write to > the response but if an IOException occurs, there is obviously no way > to report it to the client since the error implies we're unable to > write to the response any more.
Agreed. > From what I can see to complete the async request in this (or any > async scenario) one has to call asyncContext.dispatch(), wait for the > dispatch, and then call asyncContext.complete() in the dispatched > thread, or let the dispatched thread complete. And this is true even > if the IOException occurred in the brief period after startAsync but > before the initial container thread has exited. In the non-error case, you can call complete() or dispatch(). The non-error case is (currently) different. If you call complete() you'll end up with an IllegalStateException when the error handler kicks in. You have to use dispatch(). The error handle kicks in as soon as the dispatch() tries to write to the response. > This is based on the Javadoc of asyncContext.complete() by the way: > > * <p>It is legal to call this method any time after a call to * > {@link ServletRequest#startAsync()} or * {@link > ServletRequest#startAsync(ServletRequest, ServletResponse)}, * and > before a call to one of the <tt>dispatch</tt> methods * of this > class. > > It seems rather convoluted for dealing with exceptions from the > response especially in cases where the client has gone away, so I > just wanted to confirm it's the correct way and the only way. Some guidance from the EG would be good here. It does seem more natural that a call to complete() should be sufficient in this case. However, that appears to preclude the error handlers from firing since the description of error handlers describes the request completing after the handler is fired. Maybe: complete() - no error handler dispatch() - error handler One for the Servlet EG I think. Mark --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org