diff options
| author | Robert Gemmell <robbie@apache.org> | 2010-04-09 14:16:08 +0000 |
|---|---|---|
| committer | Robert Gemmell <robbie@apache.org> | 2010-04-09 14:16:08 +0000 |
| commit | 2a6a181b22220724b6a3a68d898f5260e1e884b1 (patch) | |
| tree | 06a54a9ed7ae5e5eca3de6c94b9dc1f85eea66ce /java/broker/src | |
| parent | d21645587108181012bc9d822086e10b16730a49 (diff) | |
| download | qpid-python-2a6a181b22220724b6a3a68d898f5260e1e884b1.tar.gz | |
QPID-2379: add Connection.close() method implementation
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@932428 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/broker/src')
5 files changed, 63 insertions, 4 deletions
diff --git a/java/broker/src/main/java/org/apache/qpid/qmf/QMFService.java b/java/broker/src/main/java/org/apache/qpid/qmf/QMFService.java index 381c376f56..c32fcfd73a 100644 --- a/java/broker/src/main/java/org/apache/qpid/qmf/QMFService.java +++ b/java/broker/src/main/java/org/apache/qpid/qmf/QMFService.java @@ -1214,8 +1214,9 @@ public class QMFService implements ConfigStore.ConfigEventListener public BrokerSchema.ConnectionClass.CloseMethodResponseCommand close(final BrokerSchema.ConnectionClass.CloseMethodResponseCommandFactory factory) { - //todo - throw new UnsupportedOperationException(); + _obj.mgmtClose(); + + return factory.createResponseCommand(); } public UUID getId() diff --git a/java/broker/src/main/java/org/apache/qpid/server/configuration/ConnectionConfig.java b/java/broker/src/main/java/org/apache/qpid/server/configuration/ConnectionConfig.java index ad451f44a7..0dd36fe1fe 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/configuration/ConnectionConfig.java +++ b/java/broker/src/main/java/org/apache/qpid/server/configuration/ConnectionConfig.java @@ -44,4 +44,6 @@ public interface ConnectionConfig extends ConfiguredObject<ConnectionConfigType, ConfigStore getConfigStore(); Boolean isShadow(); + + void mgmtClose(); }
\ No newline at end of file diff --git a/java/broker/src/main/java/org/apache/qpid/server/federation/BrokerLink.java b/java/broker/src/main/java/org/apache/qpid/server/federation/BrokerLink.java index ba305c96fa..fa2fb9ead1 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/federation/BrokerLink.java +++ b/java/broker/src/main/java/org/apache/qpid/server/federation/BrokerLink.java @@ -188,6 +188,11 @@ public class BrokerLink implements LinkConfig, ConnectionListener { return false; } + + public void mgmtClose() + { + _connectionConfig.mgmtClose(); + } } private class SessionFactory implements Connection.SessionFactory diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolEngine.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolEngine.java index e2735d151b..01ea7e5bb1 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolEngine.java +++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolEngine.java @@ -46,6 +46,7 @@ import org.apache.qpid.server.logging.LogActor; import org.apache.qpid.server.logging.LogSubject; import org.apache.qpid.server.logging.actors.AMQPConnectionActor; import org.apache.qpid.server.logging.actors.CurrentActor; +import org.apache.qpid.server.logging.actors.ManagementActor; import org.apache.qpid.server.logging.messages.ConnectionMessages; import org.apache.qpid.server.logging.subjects.ConnectionLogSubject; import org.apache.qpid.server.management.Managable; @@ -61,6 +62,7 @@ import org.apache.qpid.transport.NetworkDriver; import org.apache.qpid.transport.Sender; import javax.management.JMException; +import javax.management.MBeanException; import javax.security.sasl.SaslServer; import java.io.IOException; import java.net.InetSocketAddress; @@ -703,6 +705,9 @@ public class AMQProtocolEngine implements ProtocolEngine, Managable, AMQProtocol } closeAllChannels(); + + getConfigStore().removeConfiguredObject(this); + if (_managedObject != null) { _managedObject.unregister(); @@ -763,8 +768,6 @@ public class AMQProtocolEngine implements ProtocolEngine, Managable, AMQProtocol public void closeProtocolSession() { - getConfigStore().removeConfiguredObject(this); - _networkDriver.close(); try { @@ -1143,5 +1146,48 @@ public class AMQProtocolEngine implements ProtocolEngine, Managable, AMQProtocol { return false; } + + public void mgmtClose() + { + MethodRegistry methodRegistry = getMethodRegistry(); + ConnectionCloseBody responseBody = + methodRegistry.createConnectionCloseBody( + AMQConstant.REPLY_SUCCESS.getCode(), + new AMQShortString("The connection was closed using the broker's management interface."), + 0,0); + + // This seems ugly but because we use closeConnection in both normal + // broker operation and as part of the management interface it cannot + // be avoided. The Current Actor will be null when this method is + // called via the QMF management interface. As such we need to set one. + boolean removeActor = false; + if (CurrentActor.get() == null) + { + removeActor = true; + CurrentActor.set(new ManagementActor(_actor.getRootMessageLogger())); + } + + try + { + writeFrame(responseBody.generateFrame(0)); + + try + { + + closeSession(); + } + catch (AMQException ex) + { + throw new RuntimeException(ex); + } + } + finally + { + if (removeActor) + { + CurrentActor.remove(); + } + } + } } diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_0_10.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_0_10.java index 56784e7251..f1e79839c9 100755 --- a/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_0_10.java +++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_0_10.java @@ -188,4 +188,9 @@ public class ProtocolEngine_0_10 extends InputHandler implements ProtocolEngine { return false; } + + public void mgmtClose() + { + _connection.mgmtClose(); + } } |
