I believe I've got it all fixed - can you give another try ?

FYI, 'mvn install -Pfastinstall' will let you do the build fast.

I've got your test working in Tomcat, I'd appreciate if you could also test:

- immediate resume from the method accepting AsyncResponse
- timeout followed by resume from TimeoutHandler
- only save AsyncResponse in the internal list/map and then resume it later from some application thread

I have it all tested in CXF, but I'd appreciate you double-checking on your end

Thanks, Sergey

On 16/11/12 10:13, Sergey Beryozkin wrote:
I suspect the existing continuation does the no-arg startAsync() too
early for Tomcat to handle it properly, no-arg startAsync() should be
added in Continuation.resume(), just before asyncContext.dispatch() -
I'll play with it and if that won;t work then I'll open Tomcat bug request

Sergey

On 15/11/12 14:12, Gege wrote:
Well, i've got no problem with the initial "hack" i sent to you by
mail, except the timeout can only happen once...
I'll look this evening the difference, there might be something.

2012/11/15 Sergey Beryozkin<[email protected]>:
Hi

On 14/11/12 22:33, Gege wrote:

I checked out the trunk and compiled (didn't think it would be so
long, i even got oom with tests (should adjust Xmx i guess)
2.7.1-SNAPSHOT

I tried a simple timeout on jonas 5.3M6 (tomcat 7.0.22) with following
code :

@GET
@Path("/timeout/{timeout}")
@Produces("text/plain")
public void timeout(@PathParam("timeout") String timeoutStr,
@Suspended AsyncResponse ar) {
long timeout = Long.parseLong(timeoutStr);
System.out.println("timeout - enter with timeout=" + timeoutStr +
"s");
ar.setTimeoutHandler(new TimeoutHandlerImpl("Timeouted after "
+ timeout + " seconds"));
ar.setTimeout(timeout, TimeUnit.SECONDS);
}

private class TimeoutHandlerImpl implements TimeoutHandler {
private String _message;

public TimeoutHandlerImpl(String message) {
_message = message;
}

public void handleTimeout(AsyncResponse ar) {
System.out.println("handleTimeout - enter");
ar.resume(_message);
}
}

And got the following exception :
2012-11-14 23:11:42,242 : CoyoteAdapter.asyncDispatch : null
java.lang.IllegalStateException: Calling [asyncTimeout()] is not valid
for a request with Async state [DISPATCHING]
at
org.apache.coyote.AsyncStateMachine.asyncTimeout(AsyncStateMachine.java:240)

at
org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:820)

at org.apache.coyote.Request.action(Request.java:346)
at
org.apache.catalina.core.AsyncContextImpl.timeout(AsyncContextImpl.java:110)

at
org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:292)

at
org.apache.coyote.http11.AbstractHttp11Processor.asyncDispatch(AbstractHttp11Processor.java:1515)

at
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:563)

at
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)

at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)

at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)

at java.lang.Thread.run(Thread.java:679)

I didn't have time to inspect things because it's late ... so I just
dump the code and the exception, sorry.


I can confirm that I've reproduced with the latest Tomcat 7.0.32.
I can see users reporting the same issue on Google against Tomcat,
apparently it has been fixed but I suspect it has not been, given
that I've
no problems with Jetty Servlet3 implementation...

Cheers, Sergey




Reply via email to