https://bz.apache.org/bugzilla/show_bug.cgi?id=61932

            Bug ID: 61932
           Summary: IllegalStateException when calling
                    asyncContext.dispatch() in a non container thread with
                    ReadListener used
           Product: Tomcat 8
           Version: 8.5.24
          Hardware: PC
                OS: Mac OS X 10.1
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Catalina
          Assignee: dev@tomcat.apache.org
          Reporter: chanjars...@gmail.com
  Target Milestone: ----

Tomcat throws below exception when I use ReadListener and call
AsyncContext.dispatch("/url") in another thread.

Dec 27, 2017 3:35:46 PM org.apache.coyote.AbstractProtocol$ConnectionHandler
process
严重: Error reading request, ignored
java.lang.IllegalStateException: Calling [asyncOperation()] is not valid for a
request with Async state [DISPATCHING]
        at
org.apache.coyote.AsyncStateMachine.asyncOperation(AsyncStateMachine.java:253)
        at
org.apache.coyote.AbstractProcessor.dispatchNonBlockingRead(AbstractProcessor.java:505)
        at
org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:200)
        at
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
        at
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
        at
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
        at
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)

Dec 27, 2017 3:35:46 PM org.apache.catalina.connector.CoyoteAdapter
checkRecycled
信息: Encountered a non-recycled request and recycled it forcedly.
org.apache.catalina.connector.CoyoteAdapter$RecycleRequiredException
        at
org.apache.catalina.connector.CoyoteAdapter.checkRecycled(CoyoteAdapter.java:501)
        at
org.apache.coyote.http11.Http11Processor.recycle(Http11Processor.java:1707)
        at
org.apache.coyote.AbstractProtocol$ConnectionHandler.release(AbstractProtocol.java:972)
        at
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:940)
        at
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
        at
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)

Below is the code for reproducing the bug:


@WebServlet(value = "/async-read2", asyncSupported = true)
public class AsyncReadServlet2 extends HttpServlet {

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

    AsyncContext asyncCtx = req.startAsync();
    ServletInputStream is = req.getInputStream();
    is.setReadListener(new ReadListener() {

      @Override
      public void onDataAvailable() {

        try {
          byte buffer[] = new byte[1 * 1024];
          while (is.isReady() && !is.isFinished()) {
            int length = is.read(buffer);
            if (length == -1 && is.isFinished()) {
              return;
            }

          }

        } catch (IOException ex) {
          ex.printStackTrace();
        }
      }

      @Override
      public void onAllDataRead() {
      }

      @Override
      public void onError(Throwable t) {
      }
    });

    new Thread(() -> {
      try {
        Thread.sleep(10000L);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      asyncCtx.dispatch("/error");
    }).start();

  }

}

-- 
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