ARTEMIS-1887 Setting default-max-consumers in address-setting not working When setting "default-max-consumers" in addressing setting in broker.xml It has no effect on the "max-consumers" property on matching address queues.
Tests added as part of a previous commit This closes #2107 Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/fd3baf1e Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/fd3baf1e Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/fd3baf1e Branch: refs/heads/master Commit: fd3baf1ea29b55f9713bc302c313d02d76c30fab Parents: 390a07e Author: saurabhrai <[email protected]> Authored: Thu May 24 17:49:24 2018 +0530 Committer: Clebert Suconic <[email protected]> Committed: Thu May 24 14:36:23 2018 -0400 ---------------------------------------------------------------------- .../artemis/core/config/CoreQueueConfiguration.java | 14 ++++++++++++++ .../core/deployers/impl/FileConfigurationParser.java | 4 +++- .../artemis/core/server/impl/ActiveMQServerImpl.java | 7 +++++-- 3 files changed, 22 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fd3baf1e/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/CoreQueueConfiguration.java ---------------------------------------------------------------------- diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/CoreQueueConfiguration.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/CoreQueueConfiguration.java index 236fac6..f301b90 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/CoreQueueConfiguration.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/CoreQueueConfiguration.java @@ -45,6 +45,8 @@ public class CoreQueueConfiguration implements Serializable { private RoutingType routingType = ActiveMQDefaultConfiguration.getDefaultRoutingType(); + private boolean maxConsumerConfigured = false; + public CoreQueueConfiguration() { } @@ -76,6 +78,15 @@ public class CoreQueueConfiguration implements Serializable { return lastValue; } + public boolean isMaxConsumerConfigured() { + return maxConsumerConfigured; + } + + public CoreQueueConfiguration setMaxConsumerConfigured(boolean maxConsumerConfigured) { + this.maxConsumerConfigured = maxConsumerConfigured; + return this; + } + /** * @param address the address to set */ @@ -171,6 +182,7 @@ public class CoreQueueConfiguration implements Serializable { result = prime * result + ((purgeOnNoConsumers == null) ? 0 : purgeOnNoConsumers.hashCode()); result = prime * result + ((exclusive == null) ? 0 : exclusive.hashCode()); result = prime * result + ((lastValue == null) ? 0 : lastValue.hashCode()); + result = prime * result + (maxConsumerConfigured ? 1331 : 1337); return result; } @@ -190,6 +202,8 @@ public class CoreQueueConfiguration implements Serializable { return false; if (durable != other.durable) return false; + if (maxConsumerConfigured != other.maxConsumerConfigured) + return false; if (filterString == null) { if (other.filterString != null) return false; http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fd3baf1e/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java ---------------------------------------------------------------------- diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java index 0444ba8..17f3b67 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java @@ -1093,6 +1093,7 @@ public final class FileConfigurationParser extends XMLConfigurationUtil { String address = null; String filterString = null; boolean durable = true; + boolean maxConumserConfigured = false; int maxConsumers = ActiveMQDefaultConfiguration.getDefaultMaxQueueConsumers(); boolean purgeOnNoConsumers = ActiveMQDefaultConfiguration.getDefaultPurgeOnNoConsumers(); String user = null; @@ -1105,6 +1106,7 @@ public final class FileConfigurationParser extends XMLConfigurationUtil { if (item.getNodeName().equals("max-consumers")) { maxConsumers = Integer.parseInt(item.getNodeValue()); Validators.MAX_QUEUE_CONSUMERS.validate(name, maxConsumers); + maxConumserConfigured = true; } else if (item.getNodeName().equals("purge-on-no-consumers")) { purgeOnNoConsumers = Boolean.parseBoolean(item.getNodeValue()); } else if (item.getNodeName().equals("exclusive")) { @@ -1130,7 +1132,7 @@ public final class FileConfigurationParser extends XMLConfigurationUtil { } return new CoreQueueConfiguration().setAddress(address).setName(name).setFilterString(filterString).setDurable(durable).setMaxConsumers(maxConsumers).setPurgeOnNoConsumers(purgeOnNoConsumers).setUser(user) - .setExclusive(exclusive).setLastValue(lastValue); + .setExclusive(exclusive).setLastValue(lastValue).setMaxConsumerConfigured(maxConumserConfigured); } protected CoreAddressConfiguration parseAddressConfiguration(final Node node) { http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/fd3baf1e/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java ---------------------------------------------------------------------- diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java index cb58a1a..ebe0401 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java @@ -2541,15 +2541,18 @@ public class ActiveMQServerImpl implements ActiveMQServer { ActiveMQServerLogger.LOGGER.deployQueue(config.getName(), config.getAddress()); AddressSettings as = addressSettingsRepository.getMatch(config.getAddress()); // determine if there is an address::queue match; update it if so + int maxConsumerAddressSetting = as.getDefaultMaxConsumers(); + int maxConsumerQueueConfig = config.getMaxConsumers(); + int maxConsumer = (config.isMaxConsumerConfigured()) ? maxConsumerQueueConfig : maxConsumerAddressSetting; if (locateQueue(queueName) != null && locateQueue(queueName).getAddress().toString().equals(config.getAddress())) { - updateQueue(config.getName(), config.getRoutingType(), config.getMaxConsumers(), config.getPurgeOnNoConsumers(), + updateQueue(config.getName(), config.getRoutingType(), maxConsumer, config.getPurgeOnNoConsumers(), config.isExclusive() == null ? as.isDefaultExclusiveQueue() : config.isExclusive()); } else { // if the address::queue doesn't exist then create it try { createQueue(SimpleString.toSimpleString(config.getAddress()), config.getRoutingType(), queueName, SimpleString.toSimpleString(config.getFilterString()), SimpleString.toSimpleString(config.getUser()), - config.isDurable(),false,false,false,false,config.getMaxConsumers(),config.getPurgeOnNoConsumers(), + config.isDurable(),false,false,false,false,maxConsumer,config.getPurgeOnNoConsumers(), config.isExclusive() == null ? as.isDefaultExclusiveQueue() : config.isExclusive(), config.isLastValue() == null ? as.isDefaultLastValueQueue() : config.isLastValue(), true); } catch (ActiveMQQueueExistsException e) {
