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]