summaryrefslogtreecommitdiff
path: root/qpid/java
diff options
context:
space:
mode:
authorKeith Wall <kwall@apache.org>2014-07-31 13:51:18 +0000
committerKeith Wall <kwall@apache.org>2014-07-31 13:51:18 +0000
commit5b6f651d3f2c5b33fa510e120dc0e98f6a95409a (patch)
tree01a41bb120b1c280b8684a8959d9a7bb637e0e1b /qpid/java
parent83278ccb8966d9677b46665a4ffb428a3880172c (diff)
downloadqpid-python-5b6f651d3f2c5b33fa510e120dc0e98f6a95409a.tar.gz
QPID-5915: [Java Broker] Guard the case where client and server sides race to close the same connection.
This change reuses the approach taken by ConnectionRegistry when the Broker is shutdown. Namely, it logs the failure and continues to allow the Broker to shutdown. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1614893 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java')
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/ConnectionAdapter.java18
1 files changed, 17 insertions, 1 deletions
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/ConnectionAdapter.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/ConnectionAdapter.java
index f17b67d053..ba2cecedad 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/ConnectionAdapter.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/ConnectionAdapter.java
@@ -27,6 +27,8 @@ import java.util.Map;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;
+import org.apache.log4j.Logger;
+
import org.apache.qpid.protocol.AMQConstant;
import org.apache.qpid.server.model.AbstractConfiguredObject;
import org.apache.qpid.server.model.ConfiguredObject;
@@ -44,6 +46,8 @@ import org.apache.qpid.server.util.Action;
public final class ConnectionAdapter extends AbstractConfiguredObject<ConnectionAdapter> implements Connection<ConnectionAdapter>,
SessionModelListener
{
+ private static final Logger LOGGER = Logger.getLogger(ConnectionAdapter.class);
+
private final Action _underlyingConnectionDeleteTask;
private final AtomicBoolean _underlyingClosed = new AtomicBoolean(false);
private AMQConnectionModel _underlyingConnection;
@@ -61,6 +65,7 @@ public final class ConnectionAdapter extends AbstractConfiguredObject<Connection
@Override
public void performAction(final Object object)
{
+ System.out.println("Got underlying delete");
conn.removeDeleteTask(this);
_underlyingClosed.set(true);
deleted();
@@ -240,7 +245,18 @@ public final class ConnectionAdapter extends AbstractConfiguredObject<Connection
if (_underlyingClosed.compareAndSet(false, true))
{
_underlyingConnection.removeDeleteTask(_underlyingConnectionDeleteTask);
- _underlyingConnection.close(AMQConstant.CONNECTION_FORCED, "Connection closed by external action");
+ try
+ {
+ _underlyingConnection.close(AMQConstant.CONNECTION_FORCED, "Connection closed by external action");
+ }
+ catch (Exception e)
+ {
+ LOGGER.warn("Exception closing connection "
+ + _underlyingConnection.getConnectionId()
+ + " from "
+ + _underlyingConnection.getRemoteAddressString(), e);
+ }
+
}
}