Author: robbie
Date: Fri Feb  3 15:53:32 2012
New Revision: 1240223

URL: http://svn.apache.org/viewvc?rev=1240223&view=rev
Log:
QPID-3810: rework exception handling to allow the acceptor to continue after 
encountering IOE such as too many open files, ensure errors are logged at error 
level (except at close, when a SocketException will be thrown if we are 
blocking on accept() at the time), make the thread non-daemon but add support 
for it to exit when the acceptor is closed

Modified:
    
qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/io/IoNetworkTransport.java

Modified: 
qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/io/IoNetworkTransport.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/io/IoNetworkTransport.java?rev=1240223&r1=1240222&r2=1240223&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/io/IoNetworkTransport.java
 (original)
+++ 
qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/network/io/IoNetworkTransport.java
 Fri Feb  3 15:53:32 2012
@@ -20,6 +20,17 @@
  */
 package org.apache.qpid.transport.network.io;
 
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.SocketException;
+import java.nio.ByteBuffer;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLServerSocketFactory;
+
 import org.apache.qpid.protocol.ProtocolEngine;
 import org.apache.qpid.protocol.ProtocolEngineFactory;
 import org.apache.qpid.transport.ConnectionSettings;
@@ -29,22 +40,11 @@ import org.apache.qpid.transport.Transpo
 import org.apache.qpid.transport.network.IncomingNetworkTransport;
 import org.apache.qpid.transport.network.NetworkConnection;
 import org.apache.qpid.transport.network.OutgoingNetworkTransport;
-import org.apache.qpid.transport.util.Logger;
-
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLServerSocketFactory;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.SocketException;
-import java.nio.ByteBuffer;
+import org.slf4j.LoggerFactory;
 
 public class IoNetworkTransport implements OutgoingNetworkTransport, 
IncomingNetworkTransport
 {
-
-    private static final Logger LOGGER = Logger.get(IoNetworkTransport.class);
+    private static final org.slf4j.Logger LOGGER = 
LoggerFactory.getLogger(IoNetworkTransport.class);
 
     private Socket _socket;
     private IoNetworkConnection _connection;
@@ -126,7 +126,7 @@ public class IoNetworkTransport implemen
         try
         {
             _acceptor = new AcceptingThread(config, factory, sslContext);
-
+            _acceptor.setDaemon(false);
             _acceptor.start();
         }
         catch (IOException e)
@@ -139,9 +139,10 @@ public class IoNetworkTransport implemen
 
     private class AcceptingThread extends Thread
     {
+        private volatile boolean _closed = false;
         private NetworkTransportConfiguration _config;
         private ProtocolEngineFactory _factory;
-        private SSLContext _sslContent;
+        private SSLContext _sslContext;
         private ServerSocket _serverSocket;
 
         private AcceptingThread(NetworkTransportConfiguration config,
@@ -151,7 +152,7 @@ public class IoNetworkTransport implemen
         {
             _config = config;
             _factory = factory;
-            _sslContent = sslContext;
+            _sslContext = sslContext;
 
             InetSocketAddress address = new 
InetSocketAddress(config.getHost(), config.getPort());
 
@@ -161,7 +162,7 @@ public class IoNetworkTransport implemen
             }
             else
             {
-                SSLServerSocketFactory socketFactory = 
sslContext.getServerSocketFactory();
+                SSLServerSocketFactory socketFactory = 
_sslContext.getServerSocketFactory();
                 _serverSocket = socketFactory.createServerSocket();
             }
 
@@ -177,6 +178,9 @@ public class IoNetworkTransport implemen
          */
         public void close()
         {
+            LOGGER.debug("Shutting down the Acceptor");
+            _closed = true;
+
             if (!_serverSocket.isClosed())
             {
                 try
@@ -195,7 +199,7 @@ public class IoNetworkTransport implemen
         {
             try
             {
-                while (true)
+                while (!_closed)
                 {
                     try
                     {
@@ -212,23 +216,35 @@ public class IoNetworkTransport implemen
 
                         NetworkConnection connection = new 
IoNetworkConnection(socket, engine, sendBufferSize, receiveBufferSize, 
_timeout);
 
-
                         engine.setNetworkConnection(connection, 
connection.getSender());
 
                         connection.start();
-
-
                     }
                     catch(RuntimeException e)
                     {
-                        LOGGER.error(e, "Error in Acceptor thread " + 
_config.getPort());
+                        LOGGER.error("Error in Acceptor thread on port " + 
_config.getPort(), e);
+                    }
+                    catch(IOException e)
+                    {
+                        if(!_closed)
+                        {
+                            LOGGER.error("Error in Acceptor thread on port " + 
_config.getPort(), e);
+                            try
+                            {
+                                //Delay to avoid tight spinning the loop 
during issues such as too many open files
+                                Thread.sleep(1000);
+                            }
+                            catch (InterruptedException ie)
+                            {
+                                //ignore
+                            }
+                        }
                     }
                 }
             }
-            catch (IOException e)
+            finally
             {
-                LOGGER.debug(e, "SocketException - no new connections will be 
accepted on port "
-                        + _config.getPort());
+                LOGGER.debug("Acceptor exiting, no new connections will be 
accepted on port " + _config.getPort());
             }
         }
 



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:[email protected]

Reply via email to