I have a question on usage with non-blocking IO.  I'm setting up a ReadListener 
which implements onDataAvailable like this...

            @Override
            public void onDataAvailable() throws IOException
            {
                while (input.isReady())
                {
                    int read = input.read(buffer);
                    // do something with data...
                }
                // if we're done reading, close up
                if (input.isFinished())
                {
                    complete = true;
                    asyncContext.complete();
                }
            }

This seems to be working, but I'm getting the following NullPointerException.

SEVERE: Exception while processing an asynchronous request
java.lang.NullPointerException
        at 
org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:389)
        at 
org.apache.coyote.http11.AbstractHttp11Processor.asyncDispatch(AbstractHttp11Processor.java:1618)
        at 
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:631)
        at 
org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223)
        at 
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597)
        at 
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1555)
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)

After debugging a bit, here is what seems to be happening…

1.) Tomcat calls "onDataAvailable".
2.) The method above runs and reads all of the data.  Because all the data is 
processed, it comples the context.
3.) Tomcat now tries to call "onAllDataRead", but I think because I've closed 
the context it fails.

For reference, here's the section of code from CoyoteAdapter where the NPE is 
generated.

                        Thread.currentThread().setContextClassLoader(newCL);
                        req.getReadListener().onDataAvailable();
                        if (request.isFinished()) {
                            req.getReadListener().onAllDataRead();  // <-- NPE 
thrown here
                        }

My question here, is my code wrong to call asyncContext.complete() like this?  
If I restructure it to wait for "onAllDataRead" and complete the context from 
there then everything works OK.

Thanks

Dan
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to