Propchange: qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ServerMethodDispatcherImpl.java ------------------------------------------------------------------------------ svn:eol-style = native
Added: qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ServerMethodProcessor.java URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ServerMethodProcessor.java?rev=1630749&view=auto ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ServerMethodProcessor.java (added) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ServerMethodProcessor.java Fri Oct 10 09:59:55 2014 @@ -0,0 +1,957 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.server.protocol.v0_8; + +import java.security.PrivilegedAction; + +import javax.security.auth.Subject; +import javax.security.sasl.SaslException; +import javax.security.sasl.SaslServer; + +import org.apache.log4j.Logger; + +import org.apache.qpid.framing.*; +import org.apache.qpid.protocol.AMQConstant; +import org.apache.qpid.server.model.Broker; +import org.apache.qpid.server.security.SubjectCreator; +import org.apache.qpid.server.security.auth.SubjectAuthenticationResult; + +public class ServerMethodProcessor implements MethodProcessor +{ + private static final Logger LOGGER = Logger.getLogger(ServerMethodProcessor.class); + + + private static interface ChannelAction + { + void onChannel(ChannelMethodProcessor channel); + } + + private ProtocolVersion _protocolVersion; + private ServerMethodDispatcherImpl _dispatcher; + private AMQProtocolEngine _connection; + + public ServerMethodProcessor(final ProtocolVersion protocolVersion) + { + _protocolVersion = protocolVersion; + } + + + private void processChannelMethod(int channelId, final ChannelAction action) + { + final AMQChannel channel = _connection.getChannel(channelId); + if (channel == null) + { + // TODO throw body.getChannelNotFoundException(channelId, _connection.getMethodRegistry()); + } + else + { + Subject.doAs(channel.getSubject(), new PrivilegedAction<Void>() + { + @Override + public Void run() + { + action.onChannel(channel.getMethodProcessor()); + return null; + } + }); + } + + } + + @Override + public void receiveConnectionStart(final short versionMajor, + final short versionMinor, + final FieldTable serverProperties, + final byte[] mechanisms, + final byte[] locales) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(0, + new ConnectionStartBody(versionMajor, + versionMinor, + serverProperties, + mechanisms, + locales)); + } + _connection.closeConnection(AMQConstant.COMMAND_INVALID, "Unexpected method received: ConnectionStart", 0, + ConnectionStartBody.CLASS_ID, ConnectionStartBody.METHOD_ID); + + } + + @Override + public void receiveConnectionStartOk(final FieldTable clientProperties, + final AMQShortString mechanism, + final byte[] response, + final AMQShortString locale) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(0, new ConnectionStartOkBody(clientProperties, mechanism, response, locale)); + } + + Broker<?> broker = _connection.getBroker(); + + SubjectCreator subjectCreator = _connection.getSubjectCreator(); + SaslServer ss = null; + try + { + ss = subjectCreator.createSaslServer(String.valueOf(mechanism), + _connection.getLocalFQDN(), + _connection.getPeerPrincipal()); + + if (ss == null) + { + _connection.closeConnection(AMQConstant.RESOURCE_ERROR, + "Unable to create SASL Server:" + mechanism, 0, + ConnectionStartOkBody.CLASS_ID, + ConnectionStartOkBody.METHOD_ID); + } + else + { + _connection.setSaslServer(ss); + + final SubjectAuthenticationResult authResult = subjectCreator.authenticate(ss, response); + //save clientProperties + _connection.setClientProperties(clientProperties); + + MethodRegistry methodRegistry = _connection.getMethodRegistry(); + + switch (authResult.getStatus()) + { + case ERROR: + Exception cause = authResult.getCause(); + + LOGGER.info("Authentication failed:" + (cause == null ? "" : cause.getMessage())); + + _connection.closeConnection(AMQConstant.NOT_ALLOWED, + AMQConstant.NOT_ALLOWED.getName().toString(), 0, + ConnectionStartOkBody.CLASS_ID, + ConnectionStartOkBody.METHOD_ID); + + disposeSaslServer(); + break; + + case SUCCESS: + if (LOGGER.isInfoEnabled()) + { + LOGGER.info("Connected as: " + authResult.getSubject()); + } + _connection.setAuthorizedSubject(authResult.getSubject()); + + int frameMax = broker.getContextValue(Integer.class, Broker.BROKER_FRAME_SIZE); + + if (frameMax <= 0) + { + frameMax = Integer.MAX_VALUE; + } + + ConnectionTuneBody + tuneBody = + methodRegistry.createConnectionTuneBody(broker.getConnection_sessionCountLimit(), + frameMax, + broker.getConnection_heartBeatDelay()); + _connection.writeFrame(tuneBody.generateFrame(0)); + break; + case CONTINUE: + ConnectionSecureBody + secureBody = methodRegistry.createConnectionSecureBody(authResult.getChallenge()); + _connection.writeFrame(secureBody.generateFrame(0)); + } + } + } + catch (SaslException e) + { + disposeSaslServer(); + + _connection.closeConnection(AMQConstant.RESOURCE_ERROR, "SASL error: " + e.getMessage(), 0, + ConnectionStartOkBody.CLASS_ID, ConnectionStartOkBody.METHOD_ID); + } + + } + + @Override + public void receiveTxSelect(final int channelId) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, TxSelectBody.INSTANCE); + } + + } + + @Override + public void receiveTxSelectOk(final int channelId) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, TxSelectOkBody.INSTANCE); + } + + } + + @Override + public void receiveTxCommit(final int channelId) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, TxCommitBody.INSTANCE); + } + + } + + @Override + public void receiveTxCommitOk(final int channelId) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, TxCommitOkBody.INSTANCE); + } + + } + + @Override + public void receiveTxRollback(final int channelId) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, TxRollbackBody.INSTANCE); + } + + } + + @Override + public void receiveTxRollbackOk(final int channelId) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, TxRollbackOkBody.INSTANCE); + } + + } + + @Override + public void receiveConnectionSecure(final byte[] challenge) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(0, new ConnectionSecureBody(challenge)); + } + + } + + @Override + public void receiveConnectionSecureOk(final byte[] response) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(0, new ConnectionSecureOkBody(response)); + } + + } + + @Override + public void receiveConnectionTune(final int channelMax, final long frameMax, final int heartbeat) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(0, new ConnectionTuneBody(channelMax, frameMax, heartbeat)); + } + + } + + @Override + public void receiveConnectionTuneOk(final int channelMax, final long frameMax, final int heartbeat) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(0, new ConnectionTuneOkBody(channelMax, frameMax, heartbeat)); + } + + } + + @Override + public void receiveConnectionOpen(final AMQShortString virtualHost, + final AMQShortString capabilities, + final boolean insist) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(0, new ConnectionOpenBody(virtualHost, capabilities, insist)); + } + + } + + @Override + public void receiveConnectionOpenOk(final AMQShortString knownHosts) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(0, new ConnectionOpenOkBody(knownHosts)); + } + + } + + @Override + public void receiveConnectionRedirect(final AMQShortString host, final AMQShortString knownHosts) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(0, new ConnectionRedirectBody(getProtocolVersion(), host, knownHosts)); + } + + } + + @Override + public void receiveConnectionClose(final int replyCode, + final AMQShortString replyText, + final int classId, + final int methodId) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(0, + new ConnectionCloseBody(getProtocolVersion(), + replyCode, + replyText, + classId, + methodId)); + } + + } + + @Override + public void receiveConnectionCloseOk() + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(0, ProtocolVersion.v8_0.equals(getProtocolVersion()) + ? ConnectionCloseOkBody.CONNECTION_CLOSE_OK_0_8 + : ConnectionCloseOkBody.CONNECTION_CLOSE_OK_0_9); + } + } + + @Override + public void receiveChannelOpen(final int channelId) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new ChannelOpenBody()); + } + + } + + @Override + public void receiveChannelOpenOk(final int channelId) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, ProtocolVersion.v8_0.equals(getProtocolVersion()) + ? ChannelOpenOkBody.INSTANCE_0_8 + : ChannelOpenOkBody.INSTANCE_0_9); + } + } + + @Override + public void receiveChannelFlow(final int channelId, final boolean active) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new ChannelFlowBody(active)); + } + + } + + @Override + public void receiveChannelFlowOk(final int channelId, final boolean active) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new ChannelFlowOkBody(active)); + } + + } + + @Override + public void receiveChannelAlert(final int channelId, + final int replyCode, + final AMQShortString replyText, + final FieldTable details) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new ChannelAlertBody(replyCode, replyText, details)); + } + + } + + @Override + public void receiveChannelClose(final int channelId, + final int replyCode, + final AMQShortString replyText, + final int classId, + final int methodId) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new ChannelCloseBody(replyCode, replyText, classId, methodId)); + } + + } + + @Override + public void receiveChannelCloseOk(final int channelId) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, ChannelCloseOkBody.INSTANCE); + } + + } + + @Override + public void receiveAccessRequest(final int channelId, + final AMQShortString realm, + final boolean exclusive, + final boolean passive, + final boolean active, + final boolean write, + final boolean read) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = + new AMQFrame(channelId, new AccessRequestBody(realm, exclusive, passive, active, write, read)); + } + + } + + @Override + public void receiveAccessRequestOk(final int channelId, final int ticket) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new AccessRequestOkBody(ticket)); + } + + } + + @Override + public void receiveExchangeDeclare(final int channelId, + final AMQShortString exchange, + final AMQShortString type, + final boolean passive, + final boolean durable, + final boolean autoDelete, + final boolean internal, + final boolean nowait, final FieldTable arguments) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, + new ExchangeDeclareBody(0, + exchange, + type, + passive, + durable, + autoDelete, + internal, + nowait, + arguments)); + } + + } + + @Override + public void receiveExchangeDeclareOk(final int channelId) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new ExchangeDeclareOkBody()); + } + + } + + @Override + public void receiveExchangeDelete(final int channelId, + final AMQShortString exchange, + final boolean ifUnused, + final boolean nowait) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new ExchangeDeleteBody(0, exchange, ifUnused, nowait)); + } + + } + + @Override + public void receiveExchangeDeleteOk(final int channelId) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new ExchangeDeleteOkBody()); + } + + } + + @Override + public void receiveExchangeBound(final int channelId, + final AMQShortString exchange, + final AMQShortString routingKey, + final AMQShortString queue) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new ExchangeBoundBody(exchange, routingKey, queue)); + } + + } + + @Override + public void receiveExchangeBoundOk(final int channelId, final int replyCode, final AMQShortString replyText) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new ExchangeBoundOkBody(replyCode, replyText)); + } + + } + + @Override + public void receiveQueueBindOk(final int channelId) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new QueueBindOkBody()); + } + + } + + @Override + public void receiveQueueUnbindOk(final int channelId) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new QueueUnbindOkBody()); + } + + } + + @Override + public void receiveQueueDeclare(final int channelId, + final AMQShortString queue, + final boolean passive, + final boolean durable, + final boolean exclusive, + final boolean autoDelete, + final boolean nowait, + final FieldTable arguments) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, + new QueueDeclareBody(0, + queue, + passive, + durable, + exclusive, + autoDelete, + nowait, + arguments)); + } + + } + + @Override + public void receiveQueueDeclareOk(final int channelId, + final AMQShortString queue, + final long messageCount, + final long consumerCount) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new QueueDeclareOkBody(queue, messageCount, consumerCount)); + } + + } + + @Override + public void receiveQueueBind(final int channelId, + final AMQShortString queue, + final AMQShortString exchange, + final AMQShortString bindingKey, + final boolean nowait, + final FieldTable arguments) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = + new AMQFrame(channelId, new QueueBindBody(0, queue, exchange, bindingKey, nowait, arguments)); + } + + } + + @Override + public void receiveQueuePurge(final int channelId, final AMQShortString queue, final boolean nowait) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new QueuePurgeBody(0, queue, nowait)); + } + + } + + @Override + public void receiveQueuePurgeOk(final int channelId, final long messageCount) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new QueuePurgeOkBody(messageCount)); + } + + } + + @Override + public void receiveQueueDelete(final int channelId, + final AMQShortString queue, + final boolean ifUnused, + final boolean ifEmpty, + final boolean nowait) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new QueueDeleteBody(0, queue, ifUnused, ifEmpty, nowait)); + } + + } + + @Override + public void receiveQueueDeleteOk(final int channelId, final long messageCount) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new QueueDeleteOkBody(messageCount)); + } + + } + + @Override + public void receiveQueueUnbind(final int channelId, + final AMQShortString queue, + final AMQShortString exchange, + final AMQShortString bindingKey, + final FieldTable arguments) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new QueueUnbindBody(0, queue, exchange, bindingKey, arguments)); + } + + } + + @Override + public void receiveBasicRecoverSyncOk(final int channelId) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new BasicRecoverSyncOkBody(getProtocolVersion())); + } + + } + + @Override + public void receiveBasicRecover(final int channelId, final boolean requeue, final boolean sync) + { + if (ProtocolVersion.v8_0.equals(getProtocolVersion()) || !sync) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new BasicRecoverBody(requeue)); + } + + } + else + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new BasicRecoverSyncBody(getProtocolVersion(), requeue)); + } + + } + } + + @Override + public void receiveBasicQos(final int channelId, + final long prefetchSize, + final int prefetchCount, + final boolean global) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new BasicQosBody(prefetchSize, prefetchCount, global)); + } + + } + + @Override + public void receiveBasicQosOk(final int channelId) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new BasicQosOkBody()); + } + + } + + @Override + public void receiveBasicConsume(final int channelId, + final AMQShortString queue, + final AMQShortString consumerTag, + final boolean noLocal, + final boolean noAck, + final boolean exclusive, + final boolean nowait, + final FieldTable arguments) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, + new BasicConsumeBody(0, + queue, + consumerTag, + noLocal, + noAck, + exclusive, + nowait, + arguments)); + } + + } + + @Override + public void receiveBasicConsumeOk(final int channelId, final AMQShortString consumerTag) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new BasicConsumeOkBody(consumerTag)); + } + + } + + @Override + public void receiveBasicCancel(final int channelId, final AMQShortString consumerTag, final boolean noWait) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new BasicCancelBody(consumerTag, noWait)); + } + + } + + @Override + public void receiveBasicCancelOk(final int channelId, final AMQShortString consumerTag) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new BasicCancelOkBody(consumerTag)); + } + + } + + @Override + public void receiveBasicPublish(final int channelId, + final AMQShortString exchange, + final AMQShortString routingKey, + final boolean mandatory, + final boolean immediate) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = + new AMQFrame(channelId, new BasicPublishBody(0, exchange, routingKey, mandatory, immediate)); + } + + } + + @Override + public void receiveBasicReturn(final int channelId, final int replyCode, + final AMQShortString replyText, + final AMQShortString exchange, + final AMQShortString routingKey) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new BasicReturnBody(replyCode, replyText, exchange, routingKey)); + } + + } + + @Override + public void receiveBasicDeliver(final int channelId, + final AMQShortString consumerTag, + final long deliveryTag, + final boolean redelivered, + final AMQShortString exchange, + final AMQShortString routingKey) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, + new BasicDeliverBody(consumerTag, + deliveryTag, + redelivered, + exchange, + routingKey)); + } + + } + + @Override + public void receiveBasicGet(final int channelId, final AMQShortString queue, final boolean noAck) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new BasicGetBody(0, queue, noAck)); + } + + } + + @Override + public void receiveBasicGetOk(final int channelId, + final long deliveryTag, + final boolean redelivered, + final AMQShortString exchange, + final AMQShortString routingKey, + final long messageCount) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, + new BasicGetOkBody(deliveryTag, + redelivered, + exchange, + routingKey, + messageCount)); + } + + } + + @Override + public void receiveBasicGetEmpty(final int channelId) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new BasicGetEmptyBody((AMQShortString) null)); + } + + } + + @Override + public void receiveBasicAck(final int channelId, final long deliveryTag, final boolean multiple) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new BasicAckBody(deliveryTag, multiple)); + } + + } + + @Override + public void receiveBasicReject(final int channelId, final long deliveryTag, final boolean requeue) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new BasicRejectBody(deliveryTag, requeue)); + } + + } + + @Override + public void receiveHeartbeat() + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(0, new HeartbeatBody()); + } + + } + + @Override + public ProtocolVersion getProtocolVersion() + { + return _protocolVersion; + } + + public void setProtocolVersion(final ProtocolVersion protocolVersion) + { + _protocolVersion = protocolVersion; + } + + @Override + public void receiveMessageContent(final int channelId, final byte[] data) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new ContentBody(data)); + } + + } + + @Override + public void receiveMessageHeader(final int channelId, + final BasicContentHeaderProperties properties, + final long bodySize) + { + if (LOGGER.isDebugEnabled()) + { + AMQFrame frame = new AMQFrame(channelId, new ContentHeaderBody(properties, bodySize)); + } + + } + + @Override + public void receiveProtocolHeader(final ProtocolInitiation protocolInitiation) + { + if (LOGGER.isDebugEnabled()) + { + AMQDataBlock frame = protocolInitiation; + } + + } + + private void disposeSaslServer() + { + SaslServer ss = _connection.getSaslServer(); + if (ss != null) + { + _connection.setSaslServer(null); + try + { + ss.dispose(); + } + catch (SaslException e) + { + LOGGER.error("Error disposing of Sasl server: " + e); + } + } + } +} Propchange: qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/ServerMethodProcessor.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/store/derby/DerbySystemConfigImpl.java URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/store/derby/DerbySystemConfigImpl.java?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/store/derby/DerbySystemConfigImpl.java (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/store/derby/DerbySystemConfigImpl.java Fri Oct 10 09:59:55 2014 @@ -26,6 +26,7 @@ import org.apache.qpid.server.logging.Ev import org.apache.qpid.server.logging.LogRecorder; import org.apache.qpid.server.model.AbstractSystemConfig; import org.apache.qpid.server.model.Broker; +import org.apache.qpid.server.model.BrokerShutdownProvider; import org.apache.qpid.server.model.ManagedAttributeField; import org.apache.qpid.server.model.ManagedObject; import org.apache.qpid.server.model.SystemConfigFactoryConstructor; @@ -47,9 +48,10 @@ public class DerbySystemConfigImpl exten public DerbySystemConfigImpl(final TaskExecutor taskExecutor, final EventLogger eventLogger, final LogRecorder logRecorder, - final BrokerOptions brokerOptions) + final BrokerOptions brokerOptions, + final BrokerShutdownProvider brokerShutdownProvider) { - super(taskExecutor, eventLogger, logRecorder, brokerOptions); + super(taskExecutor, eventLogger, logRecorder, brokerOptions, brokerShutdownProvider); } @Override Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCSystemConfigImpl.java URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCSystemConfigImpl.java?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCSystemConfigImpl.java (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCSystemConfigImpl.java Fri Oct 10 09:59:55 2014 @@ -26,6 +26,7 @@ import org.apache.qpid.server.logging.Ev import org.apache.qpid.server.logging.LogRecorder; import org.apache.qpid.server.model.AbstractSystemConfig; import org.apache.qpid.server.model.Broker; +import org.apache.qpid.server.model.BrokerShutdownProvider; import org.apache.qpid.server.model.ManagedAttributeField; import org.apache.qpid.server.model.ManagedObject; import org.apache.qpid.server.model.SystemConfigFactoryConstructor; @@ -49,9 +50,10 @@ public class JDBCSystemConfigImpl extend public JDBCSystemConfigImpl(final TaskExecutor taskExecutor, final EventLogger eventLogger, final LogRecorder logRecorder, - final BrokerOptions brokerOptions) + final BrokerOptions brokerOptions, + final BrokerShutdownProvider brokerShutdownProvider) { - super(taskExecutor, eventLogger, logRecorder, brokerOptions); + super(taskExecutor, eventLogger, logRecorder, brokerOptions, brokerShutdownProvider); } @Override Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java Fri Oct 10 09:59:55 2014 @@ -122,7 +122,7 @@ public class HttpManagement extends Abst super(attributes, broker); } - @StateTransition(currentState = State.UNINITIALIZED, desiredState = State.ACTIVE) + @StateTransition(currentState = {State.UNINITIALIZED,State.ERRORED}, desiredState = State.ACTIVE) private void doStart() { getBroker().getEventLogger().message(ManagementConsoleMessages.STARTUP(OPERATIONAL_LOGGING_NAME)); Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/addQueue.html URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/addQueue.html?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/addQueue.html (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/addQueue.html Fri Oct 10 09:59:55 2014 @@ -39,19 +39,75 @@ <div class="clear"> <div class="formLabel-labelCell">Queue Type:</div> <div class="formLabel-controlCell"> - <input type="radio" id="formAddQueueTypeStandard" name="type" value="standard" checked="checked" dojoType="dijit.form.RadioButton" /> - <label for="formAddQueueTypeStandard">Standard</label> - - <input type="radio" id="formAddQueueTypePriority" name="type" value="priority" dojoType="dijit.form.RadioButton" /> - <label for="formAddQueueTypePriority">Priority</label> - - <input type="radio" id="formAddQueueTypeLVQ" name="type" value="lvq" dojoType="dijit.form.RadioButton" /> - <label for="formAddQueueTypeLVQ">LVQ</label> - - <input type="radio" id="formAddQueueTypeSorted" name="type" value="sorted" dojoType="dijit.form.RadioButton" /> - <label for="formAddQueueTypeSorted">Sorted</label> + <select id="formAddQueue.type" + dojoType="dijit.form.FilteringSelect" + data-dojo-props=" + name: 'type', + value: 'standard', + searchAttr: 'name', + required: true, + promptMessage: 'Type of Queue', + title: 'Enter the queue type'"> + <option value="standard">Standard</option> + <option value="priority">Priority</option> + <option value="lvq">LVQ</option> + <option value="sorted">Sorted</option> + </select> + </div> + </div> + <div class="clear"></div> + + <div id="formAddQueueType:priority" class="hidden typeSpecificDiv"> + <div class="clear"> + <div class="formLabel-labelCell">Priorities:</div> + <div class="formLabel-controlCell"> + <input type="text" id="formAddQueue.priorities" + data-dojo-type="dijit/form/ValidationTextBox" + data-dojo-props=" + name: 'priorities', + placeHolder: 'number of priorities', + promptMessage: 'Number of priorities supported by the queue', + title: 'Enter the number of priorities supported by the queue', + trim: true"/> + </div> + </div> + <div class="clear"></div> + </div> + + <div id="formAddQueueType:lvq" class="hidden typeSpecificDiv"> + <div class="clear"> + <div class="formLabel-labelCell">LVQ Message Property:</div> + <div class="formLabel-controlCell"> + <input type="text" id="formAddQueue.lvqKey" + data-dojo-type="dijit/form/ValidationTextBox" + data-dojo-props=" + name: 'lvqKey', + placeHolder: 'lvq key', + promptMessage: 'Name of the message property used to perform the conflation', + title: 'Enter the name of the message property used to perform the conflation', + trim: true"/> + </div> + </div> + <div class="clear"></div> + </div> + + <div id="formAddQueueType:sorted" class="hidden typeSpecificDiv"> + <div class="clear"> + <div class="formLabel-labelCell">Sort Message Property*:</div> + <div class="formLabel-controlCell"> + <input type="text" id="formAddQueue.sortKey" + data-dojo-type="dijit/form/ValidationTextBox" + data-dojo-props=" + name: 'sortKey', + placeHolder: 'sort key', + promptMessage: 'Name of the message property used for sorting the messages on the queue', + title: 'Enter the name of the message property used for sorting the messages on the queue', + trim: true"/> + </div> </div> + <div class="clear"></div> </div> + <div class="clear"> <div class="formLabel-labelCell">Durable?</div> <div class="formLabel-controlCell"> @@ -73,8 +129,8 @@ value: '', searchAttr: 'name', required: false, - promptMessage: 'Message durability override. If not default, messages arriving will have durability setting overridden', - title: 'Enter message durability override'"> + promptMessage: 'Message persistence override. If not default, messages arriving will have persistence setting overridden', + title: 'Enter message persistence override'"> <option value="ALWAYS">Always</option> <option value="DEFAULT">Default</option> <option value="NEVER">Never</option> @@ -108,66 +164,9 @@ </div> </div> - <br/> - <div class="clear"></div> - - - <div id="formAddQueueTypePriority:fields" class="hidden" - data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Priority Queue Settings'"> - <div class="clear"> - <div class="formLabel-labelCell">Priorities:</div> - <div class="formLabel-controlCell"> - <input type="text" id="formAddQueue.priorities" - data-dojo-type="dijit/form/ValidationTextBox" - data-dojo-props=" - name: 'priorities', - placeHolder: 'number of priorities', - promptMessage: 'Number of priorities supported by the queue', - title: 'Enter the number of priorities supported by the queue', - trim: true"/> - </div> - </div> - <div class="clear"></div> - </div> - - <div id="formAddQueueTypeLVQ:fields" class="hidden" - data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Last Value Queue Settings'"> - <div class="clear"> - <div class="formLabel-labelCell">LVQ Message Property:</div> - <div class="formLabel-controlCell"> - <input type="text" id="formAddQueue.lvqkey" - data-dojo-type="dijit/form/ValidationTextBox" - data-dojo-props=" - name: 'lvqKey', - placeHolder: 'lvq key', - promptMessage: 'Name of the message property used to perform the conflation', - title: 'Enter the name of the message property used to perform the conflation', - trim: true"/> - </div> - </div> - <div class="clear"></div> - </div> - - <div id="formAddQueueTypeSorted:fields" class="hidden" - data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Sorted Queue Settings'"> - <div class="clear"> - <div class="formLabel-labelCell">Sort Message Property*:</div> - <div class="formLabel-controlCell"> - <input type="text" id="formAddQueue.sortkey" - data-dojo-type="dijit/form/ValidationTextBox" - data-dojo-props=" - name: 'sortKey', - placeHolder: 'sort key', - promptMessage: 'Name of the message property used for sorting the messages on the queue', - title: 'Enter the name of the message property used for sorting the messages on the queue', - trim: true"/> - </div> - </div> - <div class="clear"></div> - </div> - - <br/> - <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Flow Control Settings', open: false"> + <div class="clear formBox"> + <fieldset> + <legend>Flow Control Settings</legend> <div class="clear"> <div class="formLabel-labelCell">Capacity:</div> <div class="formLabel-controlCell"> @@ -194,11 +193,13 @@ trim: true"/> </div> </div> + </fieldset> <div class="clear"></div> </div> - <br/> - <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Alerting Settings', open: false"> + <div class="clear formBox"> + <fieldset> + <legend>Alerting Settings</legend> <div class="clear"> <div class="formLabel-labelCell">Queue Depth:</div> <div class="formLabel-controlCell"> @@ -264,11 +265,13 @@ trim: true"/> </div> </div> + </fieldset> <div class="clear"></div> </div> - <br/> - <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Other Settings', open: false"> + <div class="clear formBox"> + <fieldset> + <legend>Other Settings</legend> <div class="clear"> <div class="formLabel-labelCell">Maximum Delivery Retries:</div> <div class="formLabel-controlCell"> @@ -323,9 +326,14 @@ title: 'Controls where a shared groups feature is enabled'"/> </div> </div> + </fieldset> <div class="clear"></div> </div> + <div class="clear" data-dojo-type="dijit/TitlePane" data-dojo-props="title: 'Context variables', open: false"> + <div id="formAddQueue.context" ></div> + </div> + <div class="dijitDialogPaneActionBar"> <!-- submit buttons --> <input type="submit" value="Create Queue" label="Create Queue" dojoType="dijit.form.Button" /> Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/css/common.css URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/css/common.css?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/css/common.css (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/css/common.css Fri Oct 10 09:59:55 2014 @@ -262,7 +262,6 @@ div .messages { /* Required to keep queue type radio buttons on one line when dialog adds scrollbar */ #addQueue { - max-height: 350px; overflow: auto; width: 630px; } @@ -305,4 +304,4 @@ div .messages { width:100%; max-height: 140px; overflow: auto; -} \ No newline at end of file +} Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ContextVariablesEditor.js URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ContextVariablesEditor.js?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ContextVariablesEditor.js (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/ContextVariablesEditor.js Fri Oct 10 09:59:55 2014 @@ -77,8 +77,8 @@ function (util, xhr, declare, array, con var addButton = registry.byNode(addButtonNode); var deleteButton = registry.byNode(deleteButtonNode); var layout = [[ - { name: "Name", field: "name", width: "40%", editable: true, selectOnClick: false, type: dojox.grid.cells._Widget, widgetClass: dijit.form.TextBox }, - { name: 'Actual Value', field: 'actualValue', width: '30%', editable: true, selectOnClick: false, type: dojox.grid.cells._Widget, widgetClass: dijit.form.TextBox}, + { name: "Name", field: "name", width: "40%", editable: true}, + { name: 'Actual Value', field: 'actualValue', width: '30%', editable: true}, { name: 'Effective Value', field: 'effectiveValue', width: '30%', editable: false} ]]; var data = []; @@ -177,6 +177,38 @@ function (util, xhr, declare, array, con } this.setData(actualValues, allEffectiveValues, inheritedActualValues); }, + loadInheritedData: function(restUrl) + { + var allEffectiveValues = null; + xhr.get( + { + url: restUrl, + sync: true, + content: { actuals: false }, + handleAs: "json", + load: function(data) + { + allEffectiveValues = data[0].context; + } + } + ); + + var inheritedActualValues = null; + xhr.get( + { + url: restUrl, + sync: true, + content: { actuals: true, inheritedActuals: true}, + handleAs: "json", + load: function(data) + { + inheritedActualValues = data[0].context; + } + } + ); + + this.setData({}, allEffectiveValues, inheritedActualValues); + }, setData: function(actualValues, allEffectiveValues, inheritedActualValues) { this.value = actualValues; @@ -523,4 +555,4 @@ function (util, xhr, declare, array, con } }); -}); \ No newline at end of file +}); Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Queue.js Fri Oct 10 09:59:55 2014 @@ -34,6 +34,7 @@ define(["dojo/_base/xhr", "qpid/management/moveCopyMessages", "qpid/management/showMessage", "qpid/management/UserPreferences", + "qpid/management/editQueue", "dojo/store/JsonRest", "dojox/grid/EnhancedGrid", "dojo/data/ObjectStore", @@ -42,7 +43,7 @@ define(["dojo/_base/xhr", "dojox/grid/enhanced/plugins/IndirectSelection", "dojo/domReady!"], function (xhr, parser, query, registry, connect, event, json, properties, updater, util, formatter, - UpdatableStore, addBinding, moveMessages, showMessage, UserPreferences, JsonRest, EnhancedGrid, ObjectStore, entities) { + UpdatableStore, addBinding, moveMessages, showMessage, UserPreferences, editQueue, JsonRest, EnhancedGrid, ObjectStore, entities) { function Queue(name, parent, controller) { this.name = name; @@ -172,6 +173,12 @@ define(["dojo/_base/xhr", event.stop(evt); that.deleteQueue(); }); + var editQueueButton = query(".editQueueButton", contentPane.containerNode)[0]; + connect.connect(registry.byNode(editQueueButton), "onClick", + function(evt){ + event.stop(evt); + editQueue.show({nodeName:that.modelObj.parent.parent.name, hostName:that.modelObj.parent.name,queueName:that.name}); + }); UserPreferences.addListener(that); }}); Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addQueue.js URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addQueue.js?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addQueue.js (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addQueue.js Fri Oct 10 09:59:55 2014 @@ -27,7 +27,9 @@ define(["dojo/_base/xhr", "dojo/_base/array", "dojo/_base/event", 'dojo/_base/json', + "dojo/query", 'qpid/common/util', + "qpid/common/ContextVariablesEditor", "dijit/form/NumberSpinner", // required by the form /* dojox/ validate resources */ "dojox/validate/us", "dojox/validate/web", @@ -42,22 +44,14 @@ define(["dojo/_base/xhr", /* basic dojox classes */ "dojox/form/BusyButton", "dojox/form/CheckedMultiSelect", "dojo/domReady!"], - function (xhr, dom, construct, win, registry, parser, array, event, json, util) { + function (xhr, dom, construct, win, registry, parser, array, event, json, query, util) { var addQueue = {}; var node = construct.create("div", null, win.body(), "last"); - var typeSpecificFields = { - priorities: "priority", - lvqKey: "lvq", - sortKey: "sorted" - }; - - var requiredFields = { - priority: "priorities", - sorted: "sortkey" - }; + var typeSpecificFields = { priorities: "priority", lvqKey: "lvq", sortKey: "sorted" }; + var requiredFields = { sorted: "sortKey"}; var fieldConverters = { queueFlowControlSizeBytes: parseInt, @@ -96,8 +90,8 @@ define(["dojo/_base/xhr", newQueue["messageGroupSharedGroups"] = true; } } - else if (!typeSpecificFields.hasOwnProperty(propName) || - formValues[ "type" ] === typeSpecificFields[ propName ]) { + else if (!typeSpecificFields.hasOwnProperty(propName) || formValues[ "type" ] === typeSpecificFields[ propName ]) + { if(formValues[ propName ] !== "") { if (fieldConverters.hasOwnProperty(propName)) { @@ -125,36 +119,29 @@ define(["dojo/_base/xhr", addQueue.dialogNode = dom.byId("addQueue"); parser.instantiate([addQueue.dialogNode]); - // for children which have name type, add a function to make all the associated rows - // visible / invisible as the radio button is checked / unchecked - + // for children which have name type, add a function to make all the associated atrributes + // visible / invisible as the select is changed theForm = registry.byId("formAddQueue"); - array.forEach(theForm.getDescendants(), function(widget) + var typeSelector = registry.byId("formAddQueue.type"); + typeSelector.on("change", function(value) + { + query(".typeSpecificDiv").forEach(function(node, index, arr) { - if(widget.name === "type") { - widget.on("change", function(isChecked) { - - var objId = widget.id + ":fields"; - var obj = registry.byId(objId); - if(obj) { - if(isChecked) { - obj.domNode.style.display = "block"; - } else { - obj.domNode.style.display = "none"; - } - obj.resize(); - var widgetValue = widget.value; - if (requiredFields.hasOwnProperty(widgetValue)) - { - dijit.byId('formAddQueue.' + requiredFields[widgetValue]).required = isChecked; - } - - util.applyMetadataToWidgets(obj.domNode, "Queue", widgetValue); - } - }) + if (node.id === "formAddQueueType:" + value) + { + node.style.display = "block"; + util.applyMetadataToWidgets(node, "Queue", value); + } + else + { + node.style.display = "none"; } - }); + for(var requiredField in requiredFields) + { + dijit.byId('formAddQueue.' + requiredFields[requiredField]).required = (requiredField == value); + } + }); theForm.on("submit", function(e) { @@ -200,6 +187,14 @@ define(["dojo/_base/xhr", registry.byId("addQueue").show(); util.applyMetadataToWidgets(form.domNode, "Queue", "standard"); + if (!this.context) + { + this.context = new qpid.common.ContextVariablesEditor({name: 'context', title: 'Context variables'}); + this.context.placeAt(dom.byId("formAddQueue.context")); + } + + var escapedUrl = "api/latest/virtualhost/" + encodeURIComponent(addQueue.vhostnode) + "/" + encodeURIComponent(addQueue.vhost); + this.context.loadInheritedData(escapedUrl); }; return addQueue; Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addVirtualHostNodeAndVirtualHost.js URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addVirtualHostNodeAndVirtualHost.js?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addVirtualHostNodeAndVirtualHost.js (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addVirtualHostNodeAndVirtualHost.js Fri Oct 10 09:59:55 2014 @@ -134,35 +134,10 @@ define(["dojo/_base/xhr", this.virtualHostContext.placeAt(dom.byId("addVirtualHost.context")); } - var inheritedActualValues = null; - xhr.get( - { - url: "api/latest/broker", - sync: true, - content: { actuals: true, inheritedActuals: true}, - handleAs: "json", - load: function(data) - { - inheritedActualValues = data[0].context; - } - } - ); - var effectiveValues = null; - xhr.get( - { - url: "api/latest/broker", - sync: true, - handleAs: "json", - load: function(data) - { - effectiveValues = data[0].context; - } - } - ); + this.virtualHostNodeContext.loadInheritedData("api/latest/broker"); + this.virtualHostContext.setData({}, this.virtualHostNodeContext.effectiveValues,this.virtualHostNodeContext.inheritedActualValues); - this.virtualHostNodeContext.setData({},effectiveValues,inheritedActualValues); - this.virtualHostContext.setData({},effectiveValues,inheritedActualValues); this.dialog.show(); if (!this.resizeEventRegistered) { Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/showQueue.html URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/showQueue.html?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/showQueue.html (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-http/src/main/java/resources/showQueue.html Fri Oct 10 09:59:55 2014 @@ -198,7 +198,7 @@ </div> </div> <div class="clear"> - <div class="formLabel-labelCell">Alert frequency:</div> + <div class="formLabel-labelCell">Gap between alerts:</div> <div> <span class="alertRepeatGap"></span> <span class="alertRepeatGapUnits"></span> @@ -208,6 +208,7 @@ </div> <div class="dijitDialogPaneActionBar"> + <button data-dojo-type="dijit.form.Button" class="editQueueButton" type="button">Edit Queue</button> <button data-dojo-type="dijit.form.Button" class="deleteQueueButton" type="button">Delete Queue</button> </div> </div> Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java Fri Oct 10 09:59:55 2014 @@ -29,6 +29,7 @@ import java.util.Iterator; import java.util.Map; import java.util.Set; +import javax.management.InstanceAlreadyExistsException; import javax.management.JMException; import org.apache.log4j.Logger; @@ -103,7 +104,7 @@ public class JMXManagementPluginImpl return _usePlatformMBeanServer; } - @StateTransition(currentState = State.UNINITIALIZED, desiredState = State.ACTIVE) + @StateTransition(currentState = {State.UNINITIALIZED,State.ERRORED}, desiredState = State.ACTIVE) private void doStart() throws JMException, IOException { _allowPortActivation = true; @@ -340,8 +341,8 @@ public class JMXManagementPluginImpl mbean = new UserManagementMBean((PasswordCredentialManagingAuthenticationProvider<?>) object, _objectRegistry); registerMBean(object, _pluginMBeanProvider, mbean); } - createAdditionalMBeansFromProvidersIfNecessary(object, _objectRegistry); } + createAdditionalMBeansFromProvidersIfNecessary(object, _objectRegistry); } } return mbean; @@ -351,10 +352,27 @@ public class JMXManagementPluginImpl { if (!providerMBeanExists(host, _pluginMBeanProvider)) { - VirtualHostMBean mbean = new VirtualHostMBean(host, _objectRegistry); - registerMBean(host, _pluginMBeanProvider, mbean); host.addChangeListener(_changeListener); - return mbean; + try + { + VirtualHostMBean mbean = new VirtualHostMBean(host, _objectRegistry); + registerMBean(host, _pluginMBeanProvider, mbean); + return mbean; + } + catch (InstanceAlreadyExistsException e) + { + VirtualHostNode parent = host.getParent(VirtualHostNode.class); + Set<ConfiguredObject<?>> registered = _children.keySet(); + for (ConfiguredObject<?> object: registered) + { + if (object instanceof VirtualHost && object.getParent(VirtualHostNode.class) == parent) + { + LOGGER.warn("Unexpected MBean is found for VirtualHost " + object + " belonging to node " + parent); + } + } + + throw e; + } } return null; } @@ -392,24 +410,21 @@ public class JMXManagementPluginImpl } unregisterObjectMBeans(object); _children.remove(object); - destroyChildrenMBeansIfVirtualHostNode(object); + destroyChildrenMBeans(object); } } } - private void destroyChildrenMBeansIfVirtualHostNode(ConfiguredObject<?> child) + private void destroyChildrenMBeans(ConfiguredObject<?> object) { - if (child instanceof VirtualHostNode) + for (Iterator<ConfiguredObject<?>> iterator = _children.keySet().iterator(); iterator.hasNext();) { - for (Iterator<ConfiguredObject<?>> iterator = _children.keySet().iterator(); iterator.hasNext();) + ConfiguredObject<?> registeredObject = iterator.next(); + ConfiguredObject<?> parent = registeredObject.getParent(object.getCategoryClass()); + if (parent == object) { - ConfiguredObject<?> registeredObject = iterator.next(); - ConfiguredObject<?> parent = registeredObject.getParent(VirtualHostNode.class); - if (parent == child) - { - registeredObject.removeChangeListener(_changeListener); - unregisterObjectMBeans(registeredObject); - } + registeredObject.removeChangeListener(_changeListener); + unregisterObjectMBeans(registeredObject); iterator.remove(); } } Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/memory-store/src/main/java/org/apache/qpid/server/store/MemorySystemConfigImpl.java URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/memory-store/src/main/java/org/apache/qpid/server/store/MemorySystemConfigImpl.java?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/memory-store/src/main/java/org/apache/qpid/server/store/MemorySystemConfigImpl.java (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/broker-plugins/memory-store/src/main/java/org/apache/qpid/server/store/MemorySystemConfigImpl.java Fri Oct 10 09:59:55 2014 @@ -26,6 +26,7 @@ import org.apache.qpid.server.logging.Ev import org.apache.qpid.server.logging.LogRecorder; import org.apache.qpid.server.model.AbstractSystemConfig; import org.apache.qpid.server.model.Broker; +import org.apache.qpid.server.model.BrokerShutdownProvider; import org.apache.qpid.server.model.ManagedObject; import org.apache.qpid.server.model.SystemConfigFactoryConstructor; @@ -39,9 +40,10 @@ public class MemorySystemConfigImpl exte public MemorySystemConfigImpl(final TaskExecutor taskExecutor, final EventLogger eventLogger, final LogRecorder logRecorder, - final BrokerOptions brokerOptions) + final BrokerOptions brokerOptions, + final BrokerShutdownProvider brokerShutdownProvider) { - super(taskExecutor, eventLogger, logRecorder, brokerOptions); + super(taskExecutor, eventLogger, logRecorder, brokerOptions, brokerShutdownProvider); } @Override Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1001-MessageSize-Transient-ByteSec.chartdef URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1001-MessageSize-Transient-ByteSec.chartdef?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1001-MessageSize-Transient-ByteSec.chartdef (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1001-MessageSize-Transient-ByteSec.chartdef Fri Oct 10 09:59:55 2014 @@ -20,7 +20,7 @@ chartType=XYLINE chartTitle=Impact of Message Size Bytes/S chartSubtitle=Transient messages -chartDescription=1P 1C, transient, auto-ack, with message payload between 256-262144 bytes ${baselineName}. +chartDescription=1P 1C, transient, auto-ack, with message payload between 256-262144 bytes ${baselineName}, single queue. xAxisTitle=Message Size (B) yAxisTitle=Throughput (KB/s) Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1002-MessageSize-Persistent-ByteSec.chartdef URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1002-MessageSize-Persistent-ByteSec.chartdef?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1002-MessageSize-Persistent-ByteSec.chartdef (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1002-MessageSize-Persistent-ByteSec.chartdef Fri Oct 10 09:59:55 2014 @@ -20,7 +20,7 @@ chartType=XYLINE chartTitle=Impact of Message Size Bytes/S chartSubtitle=Persistent messages -chartDescription=1P 1C, persistent, auto-ack, with message payload between 256-262144 bytes. +chartDescription=1P 1C, persistent, auto-ack, with message payload between 256-262144 bytes, single queue. xAxisTitle=Message Size (B) yAxisTitle=Throughput (KB/s) Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1003-MessageSize-Transient-MsgSec.chartdef URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1003-MessageSize-Transient-MsgSec.chartdef?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1003-MessageSize-Transient-MsgSec.chartdef (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1003-MessageSize-Transient-MsgSec.chartdef Fri Oct 10 09:59:55 2014 @@ -20,7 +20,7 @@ chartType=XYLINE chartTitle=Impact of Message Size chartSubtitle=Transient messages -chartDescription=1P 1C, transient, auto-ack, with message payload between 256-262144 bytes. +chartDescription=1P 1C, transient, auto-ack, with message payload between 256-262144 bytes, single queue. xAxisTitle=Message Size (B) yAxisTitle=Throughput (messages/s) Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1004-MessageSize-Persistent-MsgSec.chartdef URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1004-MessageSize-Persistent-MsgSec.chartdef?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1004-MessageSize-Persistent-MsgSec.chartdef (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1004-MessageSize-Persistent-MsgSec.chartdef Fri Oct 10 09:59:55 2014 @@ -20,7 +20,7 @@ chartType=XYLINE chartTitle=Impact of Message Size chartSubtitle=Persistent messages -chartDescription=1P 1C, persistent, auto-ack, with message payload between 256-262144 bytes. +chartDescription=1P 1C, persistent, auto-ack, with message payload between 256-262144 bytes, single queue. xAxisTitle=Message Size (B) yAxisTitle=Throughput (messages/s) Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1011-VaryingNumberOfProducers-AutoAck.chartdef URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1011-VaryingNumberOfProducers-AutoAck.chartdef?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1011-VaryingNumberOfProducers-AutoAck.chartdef (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1011-VaryingNumberOfProducers-AutoAck.chartdef Fri Oct 10 09:59:55 2014 @@ -20,7 +20,7 @@ chartType=XYLINE chartTitle=Varying number of producers - auto ack chartSubtitle=Persistent 1KB messages -chartDescription=1,2,5,10 P/Cs, persistent, auto-ack, with message payload 1KB. +chartDescription=1,2,5,10 P/Cs, persistent, auto-ack, with message payload 1KB, single queue. xAxisTitle=Producers yAxisTitle=Throughput (messages/s) Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1012-VaryingNumberOfConsumers-AutoAck.chartdef URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1012-VaryingNumberOfConsumers-AutoAck.chartdef?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1012-VaryingNumberOfConsumers-AutoAck.chartdef (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1012-VaryingNumberOfConsumers-AutoAck.chartdef Fri Oct 10 09:59:55 2014 @@ -20,7 +20,7 @@ chartType=XYLINE chartTitle=Varying number of consumers - auto ack chartSubtitle=Persistent 1KB messages -chartDescription=1,2,5,10 P/Cs, persistent, auto-ack, with message payload 1KB. +chartDescription=1,2,5,10 P/Cs, persistent, auto-ack, with message payload 1KB, single queue. xAxisTitle=Consumers yAxisTitle=Throughput (messages/s) Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1015-VaryingNumberOfProducers-SessionTrans.chartdef URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1015-VaryingNumberOfProducers-SessionTrans.chartdef?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1015-VaryingNumberOfProducers-SessionTrans.chartdef (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1015-VaryingNumberOfProducers-SessionTrans.chartdef Fri Oct 10 09:59:55 2014 @@ -20,7 +20,7 @@ chartType=XYLINE chartTitle=Varying number of producers - transacted chartSubtitle=Persistent 1KB messages -chartDescription=1,2,5,10 P/Cs, persistent, transacted, with message payload 1KB. +chartDescription=1,2,5,10 P/Cs, persistent, transacted, with message payload 1KB, single queue. xAxisTitle=Producers yAxisTitle=Throughput (messages/s) Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1016-VaryingNumberOfConsumers-SessionTrans.chartdef URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1016-VaryingNumberOfConsumers-SessionTrans.chartdef?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1016-VaryingNumberOfConsumers-SessionTrans.chartdef (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1016-VaryingNumberOfConsumers-SessionTrans.chartdef Fri Oct 10 09:59:55 2014 @@ -20,7 +20,7 @@ chartType=XYLINE chartTitle=Varying number of consumers - transacted chartSubtitle=Persistent 1KB messages -chartDescription=1,2,5,10 P/Cs, persistent, transacted, with message payload 1KB. +chartDescription=1,2,5,10 P/Cs, persistent, transacted, with message payload 1KB, single queue. xAxisTitle=Consumers yAxisTitle=Throughput (messages/s) Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1021-AcknowledgementModes-Persistent.chartdef URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1021-AcknowledgementModes-Persistent.chartdef?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1021-AcknowledgementModes-Persistent.chartdef (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1021-AcknowledgementModes-Persistent.chartdef Fri Oct 10 09:59:55 2014 @@ -20,7 +20,7 @@ chartType=BAR chartTitle=Performance of acknowledgement modes chartSubtitle=Persistent messages (1KB) -chartDescription=1P 1C, persistent, with message payload 1KB. +chartDescription=1P 1C, persistent, with message payload 1KB, single queue. xAxisTitle=Acknowledge mode (0=session transacted; 1=auto-acknowledge) yAxisTitle=Throughput (messages/s) Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1022-AcknowledgementModes-Transient.chartdef URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1022-AcknowledgementModes-Transient.chartdef?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1022-AcknowledgementModes-Transient.chartdef (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1022-AcknowledgementModes-Transient.chartdef Fri Oct 10 09:59:55 2014 @@ -20,7 +20,7 @@ chartType=BAR chartTitle=Performance of acknowledgement modes chartSubtitle=Transient messages (1024b) -chartDescription=1P 1C, transient, with message payload 1KB. +chartDescription=1P 1C, transient, with message payload 1KB, single queue. xAxisTitle=Acknowledge mode (0=session transacted; 1=auto-acknowledge) yAxisTitle=Throughput (messages/s) Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1030-BatchSize-Equal.chartdef URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1030-BatchSize-Equal.chartdef?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1030-BatchSize-Equal.chartdef (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1030-BatchSize-Equal.chartdef Fri Oct 10 09:59:55 2014 @@ -20,7 +20,7 @@ chartType=XYLINE chartTitle=Transaction Batch Sizes Equal chartSubtitle=Persistent 1KB messages -chartDescription=1P 1C, persistent, transacted with message payload 1KB with producer/consumer batch size varying between 1-400 messages for both P and C +chartDescription=1P 1C, persistent, transacted with message payload 1KB with producer/consumer batch size varying between 1-400 messages for both P and C, single queue. xAxisTitle=Batch Size yAxisTitle=Throughput (messages/s) Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1031-BatchSize-Unequal.chartdef URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1031-BatchSize-Unequal.chartdef?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1031-BatchSize-Unequal.chartdef (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1031-BatchSize-Unequal.chartdef Fri Oct 10 09:59:55 2014 @@ -20,7 +20,7 @@ chartType=XYLINE chartTitle=Transaction Batch Size Unequal chartSubtitle=Persistent 1KB messages -chartDescription=1P 1C, persistent, transacted with message payload 1KB with fixed batch size 1 for one party whilst other varies between 1-400 messages +chartDescription=1P 1C, persistent, transacted with message payload 1KB with fixed batch size 1 for one party whilst other varies between 1-400 messages, single queue. xAxisTitle=Batch Size yAxisTitle=Throughput (messages/s) Modified: qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1040-QueueTypes.chartdef URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1040-QueueTypes.chartdef?rev=1630749&r1=1630748&r2=1630749&view=diff ============================================================================== --- qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1040-QueueTypes.chartdef (original) +++ qpid/branches/QPID-6125-ProtocolRefactoring/java/perftests/etc/chartdefs/1040-QueueTypes.chartdef Fri Oct 10 09:59:55 2014 @@ -20,7 +20,7 @@ chartType=BAR chartTitle=Queue Types chartSubtitle=Persistent 1KB messages -chartDescription=1P 1C, persistent, auto-ack with message payload 1KB. Sorted queue - 160,000 random keys, Priority - iteriates priority 0..9. +chartDescription=1P 1C, persistent, auto-ack with message payload 1KB. Sorted queue - 160,000 random keys, Priority - iteriates priority 0..9, single queue. xAxisTitle=Queue Types yAxisTitle=Throughput (messages/s) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org