Author: kwall
Date: Fri Aug 26 14:02:42 2011
New Revision: 1162122

URL: http://svn.apache.org/viewvc?rev=1162122&view=rev
Log:
QPID-3453: Fixes an issue with closing of detached session

Modified:
    
qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/Session.java
    
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/unit/client/connection/ConnectionCloseTest.java

Modified: 
qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/Session.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/Session.java?rev=1162122&r1=1162121&r2=1162122&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/Session.java
 (original)
+++ 
qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/Session.java
 Fri Aug 26 14:02:42 2011
@@ -964,16 +964,29 @@ public class Session extends SessionInvo
 
     public void close()
     {
+        if (log.isDebugEnabled())
+        {
+            log.debug("Closing [%s] in state [%s]", this, state);
+        }
         synchronized (commands)
         {
-            state = CLOSING;
-            setClose(true);
-            sessionRequestTimeout(0);
-            sessionDetach(name.getBytes());
-
-            awaitClose();
- 
-
+            switch(state)
+            {
+                case DETACHED:
+                    state = CLOSED;
+                    delegate.closed(this);
+                    connection.removeSession(this);
+                    listener.closed(this);
+                    break;
+                case CLOSED:
+                    break;
+                default:
+                    state = CLOSING;
+                    setClose(true);
+                    sessionRequestTimeout(0);
+                    sessionDetach(name.getBytes());
+                    awaitClose();
+            }
         }
     }
 

Modified: 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/unit/client/connection/ConnectionCloseTest.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/unit/client/connection/ConnectionCloseTest.java?rev=1162122&r1=1162121&r2=1162122&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/unit/client/connection/ConnectionCloseTest.java
 (original)
+++ 
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/unit/client/connection/ConnectionCloseTest.java
 Fri Aug 26 14:02:42 2011
@@ -27,6 +27,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 import javax.jms.Connection;
+import javax.jms.JMSException;
 import javax.jms.MessageConsumer;
 import javax.jms.MessageProducer;
 import javax.jms.Queue;
@@ -98,6 +99,31 @@ public class ConnectionCloseTest extends
                    delta.size() < deltaThreshold);
     }
 
+    /**
+     * This test is added due to QPID-3453 to test connection closing when AMQ
+     * session is not closed but underlying transport session is in detached
+     * state and transport connection is closed
+     */
+    public void testConnectionCloseOnOnForcibleBrokerStop() throws Exception
+    {
+        Connection connection = getConnection();
+        connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+        stopBroker();
+
+        // we need to close connection explicitly in order to verify that
+        // closing of connection having transport session in DETACHED state and
+        // transport connection in CLOSED state does not throw an exception
+        try
+        {
+            connection.close();
+        }
+        catch (JMSException e)
+        {
+            // session closing should not fail
+            fail("Cannot close connection:" + e.getMessage());
+        }
+    }
+
     private void dumpStacks(Map<Thread,StackTraceElement[]> map)
     {
         for (Map.Entry<Thread,StackTraceElement[]> entry : map.entrySet())



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

Reply via email to