Author: kwall
Date: Thu Oct 30 16:58:52 2014
New Revision: 1635548

URL: http://svn.apache.org/r1635548
Log:
QPID-6202: [Java Broker] Ensure AMQProtocolEngine#closeSession() completes 
closure even if AMQChannel fails to close cleanly

Modified:
    
qpid/trunk/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java

Modified: 
qpid/trunk/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java?rev=1635548&r1=1635547&r2=1635548&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java
 (original)
+++ 
qpid/trunk/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQProtocolEngine.java
 Thu Oct 30 16:58:52 2014
@@ -727,17 +727,41 @@ public class AMQProtocolEngine implement
      */
     private void closeAllChannels()
     {
-        for (AMQChannel channel : getChannels())
-        {
-            channel.close();
-        }
-        synchronized (_channelMap)
+        try
         {
-            _channelMap.clear();
+            RuntimeException firstException = null;
+            for (AMQChannel channel : getChannels())
+            {
+                try
+                {
+                    channel.close();
+                }
+                catch (RuntimeException re)
+                {
+                    if (!(re instanceof ConnectionScopedRuntimeException))
+                    {
+                        _logger.error("Unexpected exception closing channel", 
re);
+                    }
+                    firstException = re;
+                }
+            }
+
+            if (firstException != null)
+            {
+                throw firstException;
+            }
         }
-        for (int i = 0; i <= CHANNEL_CACHE_SIZE; i++)
+        finally
         {
-            _cachedChannels[i] = null;
+            synchronized (_channelMap)
+            {
+                _channelMap.clear();
+            }
+            for (int i = 0; i <= CHANNEL_CACHE_SIZE; i++)
+            {
+                _cachedChannels[i] = null;
+            }
+
         }
     }
 
@@ -767,19 +791,24 @@ public class AMQProtocolEngine implement
                         
_virtualHost.getConnectionRegistry().deregisterConnection(this);
                     }
 
-                    closeAllChannels();
-
-                    for (Action<? super AMQProtocolEngine> task : _taskList)
+                    try
                     {
-                        task.performAction(this);
+                        closeAllChannels();
                     }
-
-                    synchronized(this)
+                    finally
                     {
-                        _closed = true;
-                        notifyAll();
+                        for (Action<? super AMQProtocolEngine> task : 
_taskList)
+                        {
+                            task.performAction(this);
+                        }
+
+                        synchronized (this)
+                        {
+                            _closed = true;
+                            notifyAll();
+                        }
+                        getEventLogger().message(_logSubject, 
ConnectionMessages.CLOSE());
                     }
-                    getEventLogger().message(_logSubject, 
ConnectionMessages.CLOSE());
                 }
             }
             else



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

Reply via email to