Hi, I wrote a sample app to demonstrate the problem: https://github.com/yanns/servlet31_async
You can generate an exploded war with maven: mvn war:exploded I deployed the application in tomcat 8.0.0-RC10. The 2 upload form does work. The 1st upload form uses a new thread in , and that does not work. https://github.com/yanns/servlet31_async/blob/master/src/main/java/com/yann/ReadListenerImpl.java#L22 The "onDataAvailable" is called only one time. With jetty, it does work (mvn jetty:run) I hope this can help. Yann 2014-01-08 Yann Simon <yann.simon...@gmail.com>: > 2014/1/8 Daniel Mikusa <dmik...@gopivotal.com>: >> On Jan 8, 2014, at 12:04 PM, Yann Simon <yann.simon...@gmail.com> wrote: >> >>> Hi, >>> >>> I am trying to write a servlet that asynchronously read data from the >>> servlet request input stream. >>> I tested my servlet with tomcat 8.0.0-RC5. >> >> If possible, you might want to try 8.0.0-RC10 or trunk and see if you're >> getting the same behavior. >> >>> >>> the symptoms: >>> - I must synchronously read the input stream in onDataAvailable() so >>> that the upload works >>> >>> what I expected: >>> I want to be more "reactive" (buzzword of the moment) and not read the >>> input stream until I am ready (=until the previous chunk is processed) >>> I though I could return from onDataAvailable() before having read all >>> the data, read the data in another thread. >> >> Do you have a code sample? It would help to see what you're doing. >> >>> I expected onDataAvailable() to be called again when I consumed all the data >>> (servletInputStream.isReady becomes false) >> >> Generally this sounds OK. When you call ServletInputStream.isReady() and it >> returns false, that should trigger the container to call onDataAvailable() >> when more data is available to be read. If you return from >> onDataAvailable() and ServletInputStream.isReady() is still true the >> container won't call onDataAvailable() again. You'll be responsible for >> calling it when you're ready to read more. >> >>> That way, I could implement back pressure on the browser as long as my >>> servlet has not finished its work with the actual chunk >>> >>> But if I do that, neither onDataAvailable() nor onAllDataRead() is called >>> again. >> >> Again, a code sample would be helpful. Debugging non-blocking IO is tricky. >> If you can include a sample Servlet or test case, it would greatly increase >> your chance of getting feedback. > > Thanks for the quick answer! > > I have a code sample, but it may be too complicated to help debugging > the problem. > It is written in Scala. Its purpose is to provide a servlet that runs > asynchronous action from Playframework (http://www.playframework.com/) > > https://github.com/yanns/play2-war-plugin/blob/servlet31/project-code/core/servlet31/src/main/scala/play/core/server/servlet31/RequestHandler31.scala#L74 > > The line 80 (iteratee = iteratee.pureFlatFold ) use a closure that > consumes the input stream asynchronously in another thread. > > I'll try to take the time to write a much simpler code sample in Java. > >> >> Dan >> >>> >>> When I consume the input stream synchronously in onDataAvailable(), it >>> works as expected. >>> >>> Am I misunderstanding the asynchron IO in Tomcat 8? >>> >>> Thanks in advance for any ideas! >>> Yann >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org >>> For additional commands, e-mail: users-h...@tomcat.apache.org >>> >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org >> For additional commands, e-mail: users-h...@tomcat.apache.org >> --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org