Hi,

     Use HttpClient interacts with Tomcat 7.0.21 on Linux,Sometimes HttpClinet 
throws Socket Exception that error message is "Connection reset"  While reading 
response header.Following is Tomcat config and Exception Stack
     Tomcat's Connector config:
<Connector port="38080" protocol="org.apache.coyote.http11.Http11NioProtocol" 
                connectionTimeout="3000" redirectPort="38443"
               enableLookups="false"   acceptCount="4000"  
keepAliveTimeout="3000" 
               URIEncoding="UTF-8"/>


     Exception Stack:
Caused by: java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:168)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
        at 
org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:78)
        at 
org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:106)


     Http Client use MultiThreadedHttpConnectionManager to
manage conntion ,after complete request put connection back to pool rather than 
real close.So can reuse in next request.  As far as I know the reason why the 
client throws connection reset exception should be because of Tomcat close this 
connection using Send RST rather than FIN.Because ensure that not set soLinger 
option.there must be some other reason.After read this article 
http://docs.oracle.com/javase/1.5.0/docs/guide/net/articles/connection_release.html
from oracle,it maybe abortive close,my scenario is similar with the scenario 
which the article mentioned:
     Say A has sent data to B, but B closes the socket without reading all the 
data. In this situation, B's TCP stack knows that some data is effectively lost 
and it will forcibly terminate with RST rather than use the orderly FIN 
procedure
    When HttpClient borrow a connection from ConnectionManager and write 
something to this conneciton. In the meanwhile tomcat pepare to close this 
connection due to keepalive timeout,so it don't read from this connection and 
just close it.
    I read NioEndpoint code  and find  that  process time-out after process 
selected keys.
Timeout  need proccess all key rather than selected keys.During process 
timeout,if one socket(channel) receive some data,it will do nothing and just 
close it.so the client peer will throw connectionresetException.
     Could you please tell me  my analysis is correct? I apologize for my poor 
English,
Thanks in advance!
    // Walk through the collection of ready keys and dispatch
                    // any active event.
                    while (iterator != null && iterator.hasNext()) {
                        SelectionKey sk = iterator.next();
                        KeyAttachment attachment = 
(KeyAttachment)sk.attachment();
                        // Attachment may be null if another thread has called
                        // cancelledKey()
                        if (attachment == null) {
                            iterator.remove();
                        } else {
                            attachment.access();
                            iterator.remove();
                            processKey(sk, attachment);
                        }
                    }//while


                    //process timeouts
                    timeout(keyCount,hasEvents);


     Best Regards
     Hailei Zhang



Reply via email to