diff options
| author | Keith Wall <kwall@apache.org> | 2014-07-31 13:51:18 +0000 |
|---|---|---|
| committer | Keith Wall <kwall@apache.org> | 2014-07-31 13:51:18 +0000 |
| commit | 5b6f651d3f2c5b33fa510e120dc0e98f6a95409a (patch) | |
| tree | 01a41bb120b1c280b8684a8959d9a7bb637e0e1b /qpid/java | |
| parent | 83278ccb8966d9677b46665a4ffb428a3880172c (diff) | |
| download | qpid-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.java | 18 |
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); + } + } } |
