Thanks for the response and the pointers to your code. I'll definitely take a look!
I'm not clearing the read event notifications in the persistent connection. In my code, the connection is "born" when I get it from I NHttpClientHandler.connected() and I just place it on my re-use queue at the end of HttpRequestExecutionHandler.handleResponse(). When I need to re-use, I just check NHttpClientConnection.getStatus == ACTIVE and NHttpClientConnection.isOpen() == true. Should I be calling NHttpClientConnection.resetOutput()/resetInput() before I try and re-use the connection? thanks again! Peter On Tue, Sep 22, 2009 at 3:29 PM, Oleg Kalnichevski <[email protected]> wrote: > Peter Soles wrote: > >> I'm using HttpCore NIO as part of a web app that issues long polls to a >> remote server on behalf of clients - basically it is a proxy. I previously >> used NIO as part of a simulator I was building over the summer and had good >> success with it! Now I am trying to use an enhanced version of the code as >> part of my web app since it is possible that my webapp may have to open many >> long polls to the remote server. One of the enhancements is I added to my >> code is connection recycling. >> >> My webapp operates as expected in my development environment under Windows >> and I am able to make long polls using recycled connections without errors. >> However, when I deploy it to a server running on Linux I get frequent >> fatalIOExceptions raised by the EventListener. I traced this to my >> connection recycler object that attempts to re-use a connection. It appears >> that the code sometimes hangs when I issue NHttpConnection.requestOutput() >> on a recycled connection, and then the code throws the IOException: >> Connection reset by peer. >> >> I use tcpdump to monitor the outgoing messages from my webapp to the >> remote server and I observe that the message I am trying to send when I call >> requestOutput() is never sent over the wire so I suspect that the >> "connection reset by peer" is not really what is happening. I actually >> suspect/hope that I am doing something obviously wrong in my recycle >> connection code that is causing this to happen. >> >> I've attached my code that implements my NIO communication stage for my >> web app. To use, you create a new HttpClientNIO object and then you can >> send a non-blocking request using HttpClientNIO.sendRequest(request, >> callback). When the request completes you will receive notification through >> the callback. >> >> My connection logic is this: >> >> 1. When request arrives, check for available connection on queue. >> 2. If there is not an available connection: >> a) call DefaultConnectionIOReactor.connect() start creation of new >> connection >> b) use connection as described in documentation >> c) when HttpRequestExecutionHandler.handleResponse() has completed it's >> processing, put connection on queue for re-use. >> >> 3. If there is an available connection >> a) make sure connection is active >> b) get the HttpContext from the connection NHttpConnection.getContext() >> c) reset values as needed >> d) call NHttpConnection.requestOutput >> >> Am I missing something? I should also say that I generally instantiate an >> SSLClientIOEventDispatch since the remote server uses SSL but I also get >> fatalIOException when I am not using SSL. >> >> Peter >> >> > Peter, > > It all sounds very reasonable. I have a question, though. When you put > persistent connections on the re-use queue, do you clear interest in read > event notifications? This might explain why the I/O event dispatch does not > get called when a connection is closed by the peer on the opposite end. > > Anyways, for what it is worth to you, I have also put together a very > experimental and very buggy prototype of an async HTTP agent based on > HttpCore NIO and HttpClient 4.0. Feel free to take a look at my > implementation of the non-blocking connection manager and pick some ideas or > bits of code: > > http://svn.apache.org/repos/asf/httpcomponents/asynchttpclient/trunk/ > > This is how this API looks in action: > > > http://svn.apache.org/repos/asf/httpcomponents/asynchttpclient/trunk/src/examples/org/apache/http/examples/nio/client/AsyncClientRequest.java > > You may take a special look at the code that adds logging capability to > some of the HttpCore NIO classes. > > > http://svn.apache.org/repos/asf/httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/LoggingNHttpClientConnection.java > > http://svn.apache.org/repos/asf/httpcomponents/asynchttpclient/trunk/src/main/java/org/apache/http/impl/nio/conn/LoggingIOSession.java > > This really helps with debugging. > > Hope this helps somewhat. > > Oleg > > >> ------------------------------------------------------------------------ >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [email protected] >> For additional commands, e-mail: [email protected] >> > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > >
