diff options
| author | Keith Wall <kwall@apache.org> | 2011-08-26 14:02:42 +0000 |
|---|---|---|
| committer | Keith Wall <kwall@apache.org> | 2011-08-26 14:02:42 +0000 |
| commit | ca397f81d182ee9f4c62f688c3b05083cd283443 (patch) | |
| tree | 36f41936a383c518c33a62146a10defa7383e465 /java | |
| parent | bc7c58950c0220a470c349351acefa2fe93cb78a (diff) | |
| download | qpid-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.java | 29 | ||||
| -rw-r--r-- | java/systests/src/main/java/org/apache/qpid/test/unit/client/connection/ConnectionCloseTest.java | 26 |
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()) |
