https://issues.apache.org/bugzilla/show_bug.cgi?id=50308

           Summary: Call to AsyncContext.dispatch() in the onTimeout
                    callback throws exception
           Product: Tomcat 7
           Version: 7.0.4
          Platform: PC
            Status: NEW
          Severity: critical
          Priority: P2
         Component: Catalina
        AssignedTo: dev@tomcat.apache.org
        ReportedBy: juriy.b...@gmail.com


When dispatch() method is called inside the onTimeout() function of the
AsyncListener, the exception is thrown:

SEVERE: An exception or error occurred in the container during the request
processing
java.lang.IllegalStateException: Calling [dispatchAsync()] is not valid for a
request with Async state [TIMING_OUT]
    at
org.apache.coyote.AsyncStateMachine.asyncDispatch(AsyncStateMachine.java:220)
    at
org.apache.coyote.http11.Http11NioProcessor.actionInternal(Http11NioProcessor.java:672)
    at
org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:937)
    at org.apache.coyote.Request.action(Request.java:348)
    at
org.apache.catalina.core.AsyncContextImpl.dispatch(AsyncContextImpl.java:173)
    at
org.apache.catalina.core.AsyncContextImpl.dispatch(AsyncContextImpl.java:135)
    at
org.apache.catalina.core.AsyncContextImpl.dispatch(AsyncContextImpl.java:130)
    at com.juriy.snowball.SnowServlet$1.onTimeout(SnowServlet.java:23)
    at
org.apache.catalina.core.AsyncListenerWrapper.fireOnTimeout(AsyncListenerWrapper.java:45)
    at
org.apache.catalina.core.AsyncContextImpl.timeout(AsyncContextImpl.java:109)
    at
org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:270)
    at
org.apache.coyote.http11.Http11NioProcessor.asyncDispatch(Http11NioProcessor.java:232)
    at
org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.event(Http11NioProtocol.java:305)
    at
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1526)
    at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)


The sample code is below:

    protected void service(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
        AsyncContext context = request.startAsync();
        context.setTimeout(3000);
        context.addListener(new AsyncListener() {

            public void onComplete(AsyncEvent asyncEvent) throws IOException {}

            public void onTimeout(AsyncEvent asyncEvent) throws IOException {
                System.out.println("HITTING TIMEOUT");
                asyncEvent.getAsyncContext().dispatch();
            }

            public void onError(AsyncEvent asyncEvent) throws IOException {}

            public void onStartAsync(AsyncEvent asyncEvent) throws IOException
{}
        });
}


It looks like the Servlet 3.0 specification allows to do such call, here's the
quotation that explicitly states the flow of the timeouted async contexts (page
18):

"In the event that an asynchronous operation times out, the container must run
through the following steps:
■ Invoke the AsyncListener.onTimeout method on all the AsyncListener
instances registered with the ServletRequest on which the asynchronous
operation was initiated.
■ If none of the listeners called AsyncContext.complete() or any of the
AsyncContext.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
AsyncContext.complete() or any of the AsyncContext.dispatch
methods, the container MUST call AsyncContext.complete()"

Second step assumes that the call to dispatch in onTimeout() is allowed.

-- 
Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to