Author: robbie Date: Sat Nov 3 15:15:23 2012 New Revision: 1405354 URL: http://svn.apache.org/viewvc?rev=1405354&view=rev Log: QPID-4289, QPID-4344: restore catching of TransportExceptions when trying to close the sender in CCMH. Add TransportException to the 'connection problem' types, and catch any exceptions when trying to close the network connection as a result.
Patch from Philip Harvey <[email protected]> plus some additional modifications of my own. Modified: qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionCloseMethodHandler.java qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolHandler.java Modified: qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionCloseMethodHandler.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionCloseMethodHandler.java?rev=1405354&r1=1405353&r2=1405354&view=diff ============================================================================== --- qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionCloseMethodHandler.java (original) +++ qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/handler/ConnectionCloseMethodHandler.java Sat Nov 3 15:15:23 2012 @@ -36,6 +36,7 @@ import org.apache.qpid.framing.Connectio import org.apache.qpid.framing.ConnectionCloseOkBody; import org.apache.qpid.protocol.AMQConstant; import org.apache.qpid.transport.Sender; +import org.apache.qpid.transport.TransportException; public class ConnectionCloseMethodHandler implements StateAwareMethodListener<ConnectionCloseBody> { @@ -102,7 +103,16 @@ public class ConnectionCloseMethodHandle } // Close the open TCP connection - sender.close(); + try + { + sender.close(); + } + catch(TransportException e) + { + //Ignore, they are already logged by the Sender and this + //is a connection-close being processed by the IoReceiver + //which will as it closes initiate failover if necessary. + } } } Modified: qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolHandler.java URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolHandler.java?rev=1405354&r1=1405353&r2=1405354&view=diff ============================================================================== --- qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolHandler.java (original) +++ qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/protocol/AMQProtocolHandler.java Sat Nov 3 15:15:23 2012 @@ -56,6 +56,7 @@ import org.apache.qpid.protocol.AMQMetho import org.apache.qpid.protocol.ProtocolEngine; import org.apache.qpid.thread.Threading; import org.apache.qpid.transport.Sender; +import org.apache.qpid.transport.TransportException; import org.apache.qpid.transport.network.NetworkConnection; import java.io.IOException; @@ -67,7 +68,6 @@ import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; /** * AMQProtocolHandler is the client side protocol handler for AMQP, it handles all protocol events received from the @@ -317,17 +317,29 @@ public class AMQProtocolHandler implemen */ public void exception(Throwable cause) { - boolean connectionClosed = (cause instanceof AMQConnectionClosedException || cause instanceof IOException); - if (connectionClosed) + boolean causeIsAConnectionProblem = + cause instanceof AMQConnectionClosedException || + cause instanceof IOException || + cause instanceof TransportException; + + if (causeIsAConnectionProblem) { - _network.close(); + //ensure the IoSender and IoReceiver are closed + try + { + _network.close(); + } + catch (Exception e) + { + //ignore + } } FailoverState state = getFailoverState(); if (state == FailoverState.NOT_STARTED) { - if (connectionClosed) + if (causeIsAConnectionProblem) { - _logger.info("Exception caught therefore going to attempt failover: " + cause, cause); + _logger.info("Connection exception caught therefore going to attempt failover: " + cause, cause); } else { --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
