tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mark Thomas <ma...@apache.org>
Subject Re: IOException from the response during an async request
Date Sun, 05 May 2013 15:35:54 GMT
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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Mime
View raw message