Author: rgodfrey
Date: Thu Apr 24 19:54:14 2014
New Revision: 1589855

URL: http://svn.apache.org/r1589855
Log:
QPID-5722 : Client connection read can hang forever since socket timeout is 0 
(Patch from Michael Samson)

Modified:
    
qpid/trunk/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TCPTransportProvier.java

Modified: 
qpid/trunk/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TCPTransportProvier.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TCPTransportProvier.java?rev=1589855&r1=1589854&r2=1589855&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TCPTransportProvier.java
 (original)
+++ 
qpid/trunk/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TCPTransportProvier.java
 Thu Apr 24 19:54:14 2014
@@ -33,11 +33,21 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.Socket;
+import java.net.SocketTimeoutException;
 import java.nio.ByteBuffer;
 
 class TCPTransportProvier implements TransportProvider
 {
     private final String _transport;
+    
+    // Defines read socket timeout in milliseconds.  A value of 0 means that 
the socket
+    // read will block forever.  Default value is set to 10000, which is 10 
seconds.
+    private int _readTimeout = 
Integer.getInteger("qpid.connection_read_timeout", 10000);
+        
+    // Defines the max idle read timeout in milliseconds before the connection 
is closed down in 
+    // the event of a SocketTimeoutException.  A value of -1L will disable 
idle read timeout checking.
+    // Default value is set to -1L, which means disable idle read checks.
+    private long _readIdleTimeout = 
Long.getLong("qpid.connection_read_idle_timeout", -1L);
 
     public TCPTransportProvier(final String transport)
     {
@@ -66,11 +76,11 @@ class TCPTransportProvier implements Tra
             {
                 s = new Socket(address, port);
             }
+            // set socket read timeout
+            s.setSoTimeout(_readTimeout);
 
             conn.setRemoteAddress(s.getRemoteSocketAddress());
 
-
-
             ConnectionHandler.FrameOutput<FrameBody> out = new 
ConnectionHandler.FrameOutput<FrameBody>(conn);
 
             ConnectionHandler.BytesSource src;
@@ -175,15 +185,34 @@ class TCPTransportProvier implements Tra
         {
             int read;
             boolean done = false;
-            while(!handler.isDone() && (read = inputStream.read(buf)) != -1)
+            long lastReadTime = System.currentTimeMillis();
+            while(!handler.isDone())
             {
-                ByteBuffer bbuf = ByteBuffer.wrap(buf, 0, read);
-                while(bbuf.hasRemaining() && !handler.isDone())
+                try
+                {
+                    read = inputStream.read(buf);
+                    if(read == -1)
+                    {
+                      break;
+                    }
+                    lastReadTime = System.currentTimeMillis();
+                     
+                    ByteBuffer bbuf = ByteBuffer.wrap(buf, 0, read);
+                    while(bbuf.hasRemaining() && !handler.isDone())
+                    {
+                        handler.parse(bbuf);
+                    }
+                    
+                }
+                catch(SocketTimeoutException e)
                 {
-                    handler.parse(bbuf);
+                       // Note that a SocketTimeoutException could only occur 
if _readTimeout > 0.
+                       // Only perform idle read timeout checking if 
_readIdleTimeout is greater than -1
+                       if(_readIdleTimeout > -1 && (System.currentTimeMillis() 
- lastReadTime >= _readIdleTimeout)){
+                               // break out of while loop and close down 
connection
+                               break;
+                       }
                 }
-
-
             }
             if(!handler.isDone())
             {



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to