2013/5/28 Konstantin Kolinko wrote:
>
>
> I think that your patch is wrong.
>
> Looking at how ActionCode.ASYNC_DISPATCH is handled in different
> connector implementations in Tomcat 7, the code is like the following:
>
> if (asyncStateMachine.asyncDispatch()) {
> ((AprEndpoint)endpoint).processSocketAsync(this.socket,
> SocketStatus.OPEN);
> }
>
> In your example dispatching does not happen immediately as
> asyncDispatch() call returns "false" and asyncStateMachine state
> changes to AsyncState.MUST_DISPATCH. Thus your patch works.
>
> But, there is a case when the call returns "true" and dispatching
> happens immediately. Such dispatching will be broken.
Thanks for pointing this.
>
> BTW, I wonder if the following can be an alternative:
>
> if (this.dispatch != null) throw new IllegalStateException("..");
Unfortunately this will break another scenario:
Servlet1 does dispatch to Servlet2
AsyncContext asyncContext = request.startAsync(request, response);
asyncContext .dispatch("/Servlet2");
Servlet2 does dispatch to resourceA
AsyncContext asyncContext = request.startAsync(request, response);
asyncContext .dispatch("/Servlet2"); <==== here we still do not
have invocation to AsyncContextImpl.recycle and AsyncContextImpl.dispatch
field is not null
So if we introduce a null check we will break double dispatch scenario.
The solution might be to separate the check for state and the actual action
invocation.
Wdyt?
Violeta
>
> Best regards,
> Konstantin Kolinko
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>