summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
authorKeith Wall <kwall@apache.org>2011-08-26 14:02:42 +0000
committerKeith Wall <kwall@apache.org>2011-08-26 14:02:42 +0000
commitca397f81d182ee9f4c62f688c3b05083cd283443 (patch)
tree36f41936a383c518c33a62146a10defa7383e465 /java
parentbc7c58950c0220a470c349351acefa2fe93cb78a (diff)
downloadqpid-python-ca397f81d182ee9f4c62f688c3b05083cd283443.tar.gz
QPID-3453: Fixes an issue with closing of detached session
Applied patch from Oleksandr Rudyy <orudyy@gmail.com> and Andrew MacBean <andymacbean@gmail.com> git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1162122 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java')
-rw-r--r--java/common/src/main/java/org/apache/qpid/transport/Session.java29
-rw-r--r--java/systests/src/main/java/org/apache/qpid/test/unit/client/connection/ConnectionCloseTest.java26
2 files changed, 47 insertions, 8 deletions
diff --git a/java/common/src/main/java/org/apache/qpid/transport/Session.java b/java/common/src/main/java/org/apache/qpid/transport/Session.java
index e0c6cb29d3..4c996e261c 100644
--- a/java/common/src/main/java/org/apache/qpid/transport/Session.java
+++ b/java/common/src/main/java/org/apache/qpid/transport/Session.java
@@ -964,16 +964,29 @@ public class Session extends SessionInvoker
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();
+ }
}
}
diff --git a/java/systests/src/main/java/org/apache/qpid/test/unit/client/connection/ConnectionCloseTest.java b/java/systests/src/main/java/org/apache/qpid/test/unit/client/connection/ConnectionCloseTest.java
index 6d1b6de238..7f166d07fe 100644
--- a/java/systests/src/main/java/org/apache/qpid/test/unit/client/connection/ConnectionCloseTest.java
+++ b/java/systests/src/main/java/org/apache/qpid/test/unit/client/connection/ConnectionCloseTest.java
@@ -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 QpidBrokerTestCase
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())