diff options
author | Martin Ritchie <ritchiem@apache.org> | 2007-04-23 16:38:24 +0000 |
---|---|---|
committer | Martin Ritchie <ritchiem@apache.org> | 2007-04-23 16:38:24 +0000 |
commit | c65ea55b9cdc9a93522abf013cd0ac18a044163f (patch) | |
tree | 2f8f599ba809e4ba4c038c95e979c18f0e7c5c24 | |
parent | aa307a30d277c73a4120ba6ccd2f8d823ec5fb24 (diff) | |
download | qpid-python-c65ea55b9cdc9a93522abf013cd0ac18a044163f.tar.gz |
QPID-290 - Java broker does not honor maximum number of channels threshold
Applied patch from Nuno Santos
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/branches/M2@531526 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java | 15 | ||||
-rw-r--r-- | java/systests/src/main/java/org/apache/qpid/server/channel/MaxChannelsTest.java | 75 |
2 files changed, 88 insertions, 2 deletions
diff --git a/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java b/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java index 2e62c2f1e4..3162efa183 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java +++ b/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java @@ -463,7 +463,17 @@ public class AMQMinaProtocolSession implements AMQProtocolSession, throw new AMQException("Session is marked awaiting channel close"); } - _channelMap.put(channelId, channel); + if (_channelMap.size() == _maxNoOfChannels) + { + String errorMessage = toString() + ": maximum number of channels has been reached (" + + _maxNoOfChannels + "); can't create channel"; + _logger.error(errorMessage); + throw new AMQException(AMQConstant.NOT_ALLOWED, errorMessage); + } + else + { + _channelMap.put(channel.getChannelId(), channel); + } if (((channelId & CHANNEL_CACHE_SIZE) == channelId)) { @@ -755,8 +765,9 @@ public class AMQMinaProtocolSession implements AMQProtocolSession, { return _authorizedID; } + public String getClientVersion() { - return _clientVersion == null ? null : _clientVersion.toString(); + return _clientVersion == null ? null : _clientVersion.toString(); } } diff --git a/java/systests/src/main/java/org/apache/qpid/server/channel/MaxChannelsTest.java b/java/systests/src/main/java/org/apache/qpid/server/channel/MaxChannelsTest.java new file mode 100644 index 0000000000..5ddccb8a7b --- /dev/null +++ b/java/systests/src/main/java/org/apache/qpid/server/channel/MaxChannelsTest.java @@ -0,0 +1,75 @@ +/* + * + * Copyright (c) 2006 The Apache Software Foundation + * + * Licensed 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; + +import junit.framework.TestCase; +import org.apache.mina.common.IoSession; +import org.apache.qpid.codec.AMQCodecFactory; +import org.apache.qpid.server.AMQChannel; +import org.apache.qpid.server.virtualhost.VirtualHost; +import org.apache.qpid.server.registry.IApplicationRegistry; +import org.apache.qpid.server.registry.ApplicationRegistry; +import org.apache.qpid.server.exchange.ExchangeRegistry; +import org.apache.qpid.server.queue.QueueRegistry; +import org.apache.qpid.server.queue.AMQQueue; +import org.apache.qpid.server.store.MessageStore; +import org.apache.qpid.server.store.SkeletonMessageStore; +import org.apache.qpid.AMQException; +import org.apache.qpid.protocol.AMQConstant; +import org.apache.qpid.framing.AMQShortString; + +import javax.management.JMException; + +/** Test class to test MBean operations for AMQMinaProtocolSession. */ +public class MaxChannelsTest extends TestCase +{ +// private MessageStore _messageStore = new SkeletonMessageStore(); + + public void testChannels() throws Exception + { + IApplicationRegistry appRegistry = ApplicationRegistry.getInstance(); + AMQMinaProtocolSession _protocolSession = new AMQMinaProtocolSession(new MockIoSession(), + appRegistry.getVirtualHostRegistry(), + new AMQCodecFactory(true), + null); + _protocolSession.setVirtualHost(appRegistry.getVirtualHostRegistry().getVirtualHost("test")); + + // check the channel count is correct + int channelCount = _protocolSession.getChannels().size(); + assertEquals("Initial channel count wrong", 0, channelCount); + + long maxChannels = 10L; + _protocolSession.setMaximumNumberOfChannels(maxChannels); + assertEquals("Number of channels not correctly set.", new Long(maxChannels), _protocolSession.getMaximumNumberOfChannels()); + + + try + { + for (long currentChannel = 0L; currentChannel < maxChannels; currentChannel++) + { + _protocolSession.addChannel(new AMQChannel(_protocolSession, (int) currentChannel, null, null)); + } + } + catch (AMQException e) + { + assertEquals("Wrong exception recevied.", e.getErrorCode(), AMQConstant.NOT_ALLOWED); + } + assertEquals("Maximum number of channels not set.", new Long(maxChannels), new Long(_protocolSession.getChannels().size())); + } + +} |