From df547bcb4497395ed5536ffd72b713d87187e97f Mon Sep 17 00:00:00 2001 From: Martin Ritchie Date: Fri, 10 Apr 2009 23:46:19 +0000 Subject: QPID-1779 : Application of patches attached to JIRA. Should address connection close issues experienced on 0-8/9 branch Excluded test from TCP runs as it is hardwired to InVM. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@764109 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/qpid/client/AMQConnection.java | 10 ++++++++-- .../java/org/apache/qpid/client/AMQSession.java | 22 +++++++++++++--------- .../apache/qpid/client/BasicMessageConsumer.java | 5 ++++- .../java/org/apache/qpid/client/Closeable.java | 18 ++++++++++++++++++ 4 files changed, 43 insertions(+), 12 deletions(-) (limited to 'java/client') diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java b/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java index 5c48d73e43..c09b05bda8 100644 --- a/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java +++ b/java/client/src/main/java/org/apache/qpid/client/AMQConnection.java @@ -58,6 +58,7 @@ import org.apache.qpid.AMQConnectionFailureException; import org.apache.qpid.AMQException; import org.apache.qpid.AMQProtocolException; import org.apache.qpid.AMQUnresolvedAddressException; +import org.apache.qpid.AMQDisconnectedException; import org.apache.qpid.client.configuration.ClientProperties; import org.apache.qpid.client.failover.FailoverException; import org.apache.qpid.client.failover.FailoverProtectedOperation; @@ -924,7 +925,12 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect { if (!_closed.getAndSet(true)) { - doClose(sessions, timeout); + _closing.set(true); + try{ + doClose(sessions, timeout); + }finally{ + _closing.set(false); + } } } @@ -1318,7 +1324,7 @@ public class AMQConnection extends Closeable implements Connection, QueueConnect // in the case of an IOException, MINA has closed the protocol session so we set _closed to true // so that any generic client code that tries to close the connection will not mess up this error // handling sequence - if (cause instanceof IOException) + if (cause instanceof IOException || cause instanceof AMQDisconnectedException) { closer = !_closed.getAndSet(true); diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQSession.java b/java/client/src/main/java/org/apache/qpid/client/AMQSession.java index b632c56708..2782505191 100644 --- a/java/client/src/main/java/org/apache/qpid/client/AMQSession.java +++ b/java/client/src/main/java/org/apache/qpid/client/AMQSession.java @@ -282,7 +282,7 @@ public abstract class AMQSession extends Closeable implements Messa { try { - sendCancel(); + if (!_connection.isClosing()) + { + sendCancel(); + } } catch (AMQException e) { diff --git a/java/client/src/main/java/org/apache/qpid/client/Closeable.java b/java/client/src/main/java/org/apache/qpid/client/Closeable.java index 7e119343a1..e6771e122c 100644 --- a/java/client/src/main/java/org/apache/qpid/client/Closeable.java +++ b/java/client/src/main/java/org/apache/qpid/client/Closeable.java @@ -51,6 +51,13 @@ public abstract class Closeable */ protected final AtomicBoolean _closed = new AtomicBoolean(false); + /** + * Are we in the process of closing. We have this distinction so we can + * still signal we are in the process of closing so other objects can tell + * the difference and tidy up. + */ + protected final AtomicBoolean _closing = new AtomicBoolean(false); + /** * Checks if this is closed, and raises a JMSException if it is. * @@ -74,6 +81,17 @@ public abstract class Closeable return _closed.get(); } + /** + * Checks if this is closis. + * + * @return true if we are closing, false otherwise. + */ + public boolean isClosing() + { + return _closing.get(); + } + + /** * Closes this object. * -- cgit v1.2.1