From b4116f56edf02c2906f4af524b5c45b3800bfcc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Andr=C3=A9=20Pearce?= Date: Sat, 8 Sep 2018 00:23:55 +0100 Subject: [PATCH] ARTEMIS-2081 listConfiguredQueues returns only queues created by config Extend test case to reproduce problem of client created queues being incorrectly removed on simple reload of config. Add a flag/field to the queues created by configuration/broker.xml so we can correctly filter only queues created/managed by config. Update listConfiguredQueues to use the new queue flag --- .../api/core/management/QueueControl.java | 6 +++ .../management/impl/QueueControlImpl.java | 12 ++++++ .../core/persistence/QueueBindingInfo.java | 4 ++ .../AbstractJournalStorageManager.java | 2 +- .../codec/PersistentQueueBindingEncoding.java | 27 +++++++++++- .../artemis/core/postoffice/PostOffice.java | 3 +- .../core/postoffice/impl/PostOfficeImpl.java | 7 +++- .../activemq/artemis/core/server/Queue.java | 4 ++ .../artemis/core/server/QueueConfig.java | 24 +++++++++-- .../core/server/impl/ActiveMQServerImpl.java | 41 +++++++++++++++++-- .../core/server/impl/LastValueQueue.java | 3 +- .../server/impl/PostOfficeJournalLoader.java | 3 +- .../core/server/impl/QueueFactoryImpl.java | 7 ++-- .../artemis/core/server/impl/QueueImpl.java | 21 ++++++++-- .../impl/ScheduledDeliveryHandlerTest.java | 10 +++++ .../tests/integration/jms/RedeployTest.java | 10 +++++ .../management/QueueControlUsingCoreTest.java | 5 +++ .../reload-address-queues-updated.xml | 4 ++ .../test/resources/reload-address-queues.xml | 4 ++ .../unit/core/postoffice/impl/FakeQueue.java | 10 +++++ .../server/impl/fakes/FakePostOffice.java | 3 +- 21 files changed, 189 insertions(+), 21 deletions(-) diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/QueueControl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/QueueControl.java index d213446c01f..b210530f1c4 100644 --- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/QueueControl.java +++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/QueueControl.java @@ -222,6 +222,12 @@ public interface QueueControl { @Attribute(desc = "delete this queue when the last consumer disconnects") boolean isPurgeOnNoConsumers(); + /** + * + */ + @Attribute(desc = "is this queue managed by configuration (broker.xml)") + boolean isConfigurationManaged(); + /** * */ diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/QueueControlImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/QueueControlImpl.java index 7377846208b..3db5caef58a 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/QueueControlImpl.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/QueueControlImpl.java @@ -489,6 +489,18 @@ public boolean isPurgeOnNoConsumers() { } } + @Override + public boolean isConfigurationManaged() { + checkStarted(); + + clearIO(); + try { + return queue.isConfigurationManaged(); + } finally { + blockOnIO(); + } + } + @Override public boolean isExclusive() { checkStarted(); diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/QueueBindingInfo.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/QueueBindingInfo.java index ebc86fc1bb7..9d7bb7eb159 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/QueueBindingInfo.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/QueueBindingInfo.java @@ -40,6 +40,10 @@ public interface QueueBindingInfo { boolean isAutoCreated(); + boolean isConfigurationManaged(); + + void setConfigurationManaged(boolean configurationManaged); + SimpleString getUser(); void addQueueStatusEncoding(QueueStatusEncoding status); diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AbstractJournalStorageManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AbstractJournalStorageManager.java index 8c3cc77f3f4..39511f100bd 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AbstractJournalStorageManager.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AbstractJournalStorageManager.java @@ -1290,7 +1290,7 @@ private void internalQueueBinding(boolean update, final long tx, final Binding b SimpleString filterString = filter == null ? null : filter.getFilterString(); - PersistentQueueBindingEncoding bindingEncoding = new PersistentQueueBindingEncoding(queue.getName(), binding.getAddress(), filterString, queue.getUser(), queue.isAutoCreated(), queue.getMaxConsumers(), queue.isPurgeOnNoConsumers(), queue.isExclusive(), queue.isLastValue(), queue.getConsumersBeforeDispatch(), queue.getDelayBeforeDispatch(), queue.getRoutingType().getType()); + PersistentQueueBindingEncoding bindingEncoding = new PersistentQueueBindingEncoding(queue.getName(), binding.getAddress(), filterString, queue.getUser(), queue.isAutoCreated(), queue.getMaxConsumers(), queue.isPurgeOnNoConsumers(), queue.isExclusive(), queue.isLastValue(), queue.getConsumersBeforeDispatch(), queue.getDelayBeforeDispatch(), queue.getRoutingType().getType(), queue.isConfigurationManaged()); readLock(); try { diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/codec/PersistentQueueBindingEncoding.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/codec/PersistentQueueBindingEncoding.java index 0cfe67c097c..a7d52167b7a 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/codec/PersistentQueueBindingEncoding.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/codec/PersistentQueueBindingEncoding.java @@ -56,6 +56,8 @@ public class PersistentQueueBindingEncoding implements EncodingSupport, QueueBin public byte routingType; + public boolean configurationManaged; + public PersistentQueueBindingEncoding() { } @@ -86,6 +88,8 @@ public String toString() { delayBeforeDispatch + ", routingType=" + routingType + + ", configurationManaged=" + + configurationManaged + "]"; } @@ -100,7 +104,8 @@ public PersistentQueueBindingEncoding(final SimpleString name, final boolean lastValue, final int consumersBeforeDispatch, final long delayBeforeDispatch, - final byte routingType) { + final byte routingType, + final boolean configurationManaged) { this.name = name; this.address = address; this.filterString = filterString; @@ -113,6 +118,7 @@ public PersistentQueueBindingEncoding(final SimpleString name, this.consumersBeforeDispatch = consumersBeforeDispatch; this.delayBeforeDispatch = delayBeforeDispatch; this.routingType = routingType; + this.configurationManaged = configurationManaged; } @Override @@ -154,6 +160,16 @@ public boolean isAutoCreated() { return autoCreated; } + @Override + public boolean isConfigurationManaged() { + return configurationManaged; + } + + @Override + public void setConfigurationManaged(boolean configurationManaged) { + this.configurationManaged = configurationManaged; + } + @Override public void addQueueStatusEncoding(QueueStatusEncoding status) { if (queueStatusEncodings == null) { @@ -288,6 +304,11 @@ public void decode(final ActiveMQBuffer buffer) { } else { delayBeforeDispatch = ActiveMQDefaultConfiguration.getDefaultDelayBeforeDispatch(); } + if (buffer.readableBytes() > 0) { + configurationManaged = buffer.readBoolean(); + } else { + configurationManaged = false; + } } @Override @@ -304,6 +325,7 @@ public void encode(final ActiveMQBuffer buffer) { buffer.writeBoolean(lastValue); buffer.writeInt(consumersBeforeDispatch); buffer.writeLong(delayBeforeDispatch); + buffer.writeBoolean(configurationManaged); } @Override @@ -317,7 +339,8 @@ public int getEncodeSize() { DataConstants.SIZE_BOOLEAN + DataConstants.SIZE_BOOLEAN + DataConstants.SIZE_INT + - DataConstants.SIZE_LONG; + DataConstants.SIZE_LONG + + DataConstants.SIZE_BOOLEAN; } private SimpleString createMetadata() { diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/PostOffice.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/PostOffice.java index d31e33b4ce5..6ed91b44de2 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/PostOffice.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/PostOffice.java @@ -73,7 +73,8 @@ QueueBinding updateQueue(SimpleString name, Boolean exclusive, Integer consumersBeforeDispatch, Long delayBeforeDispatch, - SimpleString user) throws Exception; + SimpleString user, + Boolean configurationManaged) throws Exception; List listQueuesForAddress(SimpleString address) throws Exception; diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java index d4cde187934..02abf466c6c 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java @@ -471,7 +471,8 @@ public QueueBinding updateQueue(SimpleString name, Boolean exclusive, Integer consumersBeforeDispatch, Long delayBeforeDispatch, - SimpleString user) throws Exception { + SimpleString user, + Boolean configurationManaged) throws Exception { synchronized (addressLock) { final QueueBinding queueBinding = (QueueBinding) addressManager.getBinding(name); if (queueBinding == null) { @@ -527,6 +528,10 @@ public QueueBinding updateQueue(SimpleString name, changed = true; queue.setFilter(filter); } + if (configurationManaged != null && !configurationManaged.equals(queue.isConfigurationManaged())) { + changed = true; + queue.setConfigurationManaged(configurationManaged); + } if (logger.isDebugEnabled()) { if (user == null && queue.getUser() != null) { logger.debug("Ignoring updating Queue to a NULL user"); diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Queue.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Queue.java index 63d39c7c16e..a8f1095f0eb 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Queue.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Queue.java @@ -94,6 +94,10 @@ public interface Queue extends Bindable,CriticalComponent { void setMaxConsumer(int maxConsumers); + boolean isConfigurationManaged(); + + void setConfigurationManaged(boolean configurationManaged); + void addConsumer(Consumer consumer) throws Exception; void removeConsumer(Consumer consumer); diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/QueueConfig.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/QueueConfig.java index c83e08a7a9c..c79114da5c2 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/QueueConfig.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/QueueConfig.java @@ -42,6 +42,7 @@ public final class QueueConfig { private final boolean purgeOnNoConsumers; private final int consumersBeforeDispatch; private final long delayBeforeDispatch; + private final boolean configurationManaged; public static final class Builder { @@ -61,6 +62,7 @@ public static final class Builder { private boolean purgeOnNoConsumers; private int consumersBeforeDispatch; private long delayBeforeDispatch; + private boolean configurationManaged; private Builder(final long id, final SimpleString name) { this(id, name, name); @@ -83,6 +85,7 @@ private Builder(final long id, final SimpleString name, final SimpleString addre this.purgeOnNoConsumers = ActiveMQDefaultConfiguration.getDefaultPurgeOnNoConsumers(); this.consumersBeforeDispatch = ActiveMQDefaultConfiguration.getDefaultConsumersBeforeDispatch(); this.delayBeforeDispatch = ActiveMQDefaultConfiguration.getDefaultDelayBeforeDispatch(); + this.configurationManaged = false; validateState(); } @@ -99,6 +102,11 @@ private void validateState() { } } + public Builder configurationManaged(final boolean configurationManaged) { + this.configurationManaged = configurationManaged; + return this; + } + public Builder filter(final Filter filter) { this.filter = filter; return this; @@ -185,7 +193,7 @@ public QueueConfig build() { } else { pageSubscription = null; } - return new QueueConfig(id, address, name, filter, pageSubscription, user, durable, temporary, autoCreated, routingType, maxConsumers, exclusive, lastValue, consumersBeforeDispatch, delayBeforeDispatch, purgeOnNoConsumers); + return new QueueConfig(id, address, name, filter, pageSubscription, user, durable, temporary, autoCreated, routingType, maxConsumers, exclusive, lastValue, consumersBeforeDispatch, delayBeforeDispatch, purgeOnNoConsumers, configurationManaged); } } @@ -233,7 +241,8 @@ private QueueConfig(final long id, final boolean lastValue, final int consumersBeforeDispatch, final long delayBeforeDispatch, - final boolean purgeOnNoConsumers) { + final boolean purgeOnNoConsumers, + final boolean configurationManaged) { this.id = id; this.address = address; this.name = name; @@ -250,6 +259,7 @@ private QueueConfig(final long id, this.maxConsumers = maxConsumers; this.consumersBeforeDispatch = consumersBeforeDispatch; this.delayBeforeDispatch = delayBeforeDispatch; + this.configurationManaged = configurationManaged; } public long id() { @@ -316,6 +326,10 @@ public long delayBeforeDispatch() { return delayBeforeDispatch; } + public boolean isConfigurationManaged() { + return configurationManaged; + } + @Override public boolean equals(Object o) { if (this == o) @@ -357,6 +371,8 @@ public boolean equals(Object o) { return false; if (purgeOnNoConsumers != that.purgeOnNoConsumers) return false; + if (configurationManaged != that.configurationManaged) + return false; return user != null ? user.equals(that.user) : that.user == null; } @@ -379,6 +395,7 @@ public int hashCode() { result = 31 * result + consumersBeforeDispatch; result = 31 * result + Long.hashCode(delayBeforeDispatch); result = 31 * result + (purgeOnNoConsumers ? 1 : 0); + result = 31 * result + (configurationManaged ? 1 : 0); return result; } @@ -400,6 +417,7 @@ public String toString() { + ", lastValue=" + lastValue + ", consumersBeforeDispatch=" + consumersBeforeDispatch + ", delayBeforeDispatch=" + delayBeforeDispatch - + ", purgeOnNoConsumers=" + purgeOnNoConsumers + '}'; + + ", purgeOnNoConsumers=" + purgeOnNoConsumers + + ", configurationManaged=" + configurationManaged + '}'; } } 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 dcb6e02d750..b5a49eec307 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 @@ -2729,7 +2729,7 @@ private Set listAddressNames() { } private List listConfiguredQueues(SimpleString address) throws Exception { - return listQueues(address).stream().filter(queue -> !queue.isAutoCreated() && !queue.isInternalQueue()).collect(Collectors.toList()); + return listQueues(address).stream().filter(queue -> queue.isConfigurationManaged()).collect(Collectors.toList()); } private List listQueues(SimpleString address) throws Exception { @@ -2794,7 +2794,7 @@ private void deployQueuesFromListCoreQueueConfiguration(List queueBindingInfosMap, .lastValue(queueBindingInfo.isLastValue()) .consumersBeforeDispatch(queueBindingInfo.getConsumersBeforeDispatch()) .delayBeforeDispatch(queueBindingInfo.getDelayBeforeDispatch()) - .routingType(RoutingType.getType(queueBindingInfo.getRoutingType())); + .routingType(RoutingType.getType(queueBindingInfo.getRoutingType())) + .configurationManaged((queueBindingInfo.isConfigurationManaged())); final Queue queue = queueFactory.createQueueWith(queueConfigBuilder.build()); queue.setConsumersRefCount(new QueueManagerImpl(((PostOfficeImpl)postOffice).getServer(), queueBindingInfo.getQueueName())); diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueFactoryImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueFactoryImpl.java index 24b36e6111b..c8835d8caf9 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueFactoryImpl.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueFactoryImpl.java @@ -74,11 +74,10 @@ public void setPostOffice(final PostOffice postOffice) { public Queue createQueueWith(final QueueConfig config) { final Queue queue; if (config.isLastValue()) { - queue = new LastValueQueue(config.id(), config.address(), config.name(), config.filter(), config.pageSubscription(), config.user(), config.isDurable(), config.isTemporary(), config.isAutoCreated(), config.deliveryMode(), config.maxConsumers(), config.isExclusive(), config.consumersBeforeDispatch(), config.delayBeforeDispatch(), config.isPurgeOnNoConsumers(), scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executorFactory.getExecutor(), server, this); + queue = new LastValueQueue(config.id(), config.address(), config.name(), config.filter(), config.pageSubscription(), config.user(), config.isDurable(), config.isTemporary(), config.isAutoCreated(), config.deliveryMode(), config.maxConsumers(), config.isExclusive(), config.consumersBeforeDispatch(), config.delayBeforeDispatch(), config.isPurgeOnNoConsumers(), config.isConfigurationManaged(), scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executorFactory.getExecutor(), server, this); } else { - queue = new QueueImpl(config.id(), config.address(), config.name(), config.filter(), config.pageSubscription(), config.user(), config.isDurable(), config.isTemporary(), config.isAutoCreated(), config.deliveryMode(), config.maxConsumers(), config.isExclusive(), config.consumersBeforeDispatch(), config.delayBeforeDispatch(), config.isPurgeOnNoConsumers(), scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executorFactory.getExecutor(), server, this); + queue = new QueueImpl(config.id(), config.address(), config.name(), config.filter(), config.pageSubscription(), config.user(), config.isDurable(), config.isTemporary(), config.isAutoCreated(), config.deliveryMode(), config.maxConsumers(), config.isExclusive(), config.consumersBeforeDispatch(), config.delayBeforeDispatch(), config.isPurgeOnNoConsumers(), config.isConfigurationManaged(), scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executorFactory.getExecutor(), server, this); } - server.getCriticalAnalyzer().add(queue); return queue; } @@ -102,7 +101,7 @@ public Queue createQueue(final long persistenceID, Queue queue; if (addressSettings.isDefaultLastValueQueue()) { - queue = new LastValueQueue(persistenceID, address, name, filter, pageSubscription, user, durable, temporary, autoCreated, ActiveMQDefaultConfiguration.getDefaultRoutingType(), ActiveMQDefaultConfiguration.getDefaultMaxQueueConsumers(), ActiveMQDefaultConfiguration.getDefaultExclusive(), ActiveMQDefaultConfiguration.getDefaultConsumersBeforeDispatch(), ActiveMQDefaultConfiguration.getDefaultDelayBeforeDispatch(), ActiveMQDefaultConfiguration.getDefaultPurgeOnNoConsumers(), scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executorFactory.getExecutor(), server, this); + queue = new LastValueQueue(persistenceID, address, name, filter, pageSubscription, user, durable, temporary, autoCreated, ActiveMQDefaultConfiguration.getDefaultRoutingType(), ActiveMQDefaultConfiguration.getDefaultMaxQueueConsumers(), ActiveMQDefaultConfiguration.getDefaultExclusive(), ActiveMQDefaultConfiguration.getDefaultConsumersBeforeDispatch(), ActiveMQDefaultConfiguration.getDefaultDelayBeforeDispatch(), ActiveMQDefaultConfiguration.getDefaultPurgeOnNoConsumers(), false, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executorFactory.getExecutor(), server, this); } else { queue = new QueueImpl(persistenceID, address, name, filter, pageSubscription, user, durable, temporary, autoCreated, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executorFactory.getExecutor(), server, this); } diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java index 2891350e6a2..69d43360928 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java @@ -279,9 +279,11 @@ public class QueueImpl extends CriticalComponentImpl implements Queue { public volatile long dispatchStartTime = -1; - private int consumersBeforeDispatch = 0; + private volatile int consumersBeforeDispatch = 0; - private long delayBeforeDispatch = 0; + private volatile long delayBeforeDispatch = 0; + + private volatile boolean configurationManaged; /** @@ -429,7 +431,7 @@ public QueueImpl(final long id, final ArtemisExecutor executor, final ActiveMQServer server, final QueueFactory factory) { - this(id, address, name, filter, pageSubscription, user, durable, temporary, autoCreated, routingType, maxConsumers, exclusive, null, null, purgeOnNoConsumers, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executor, server, factory); + this(id, address, name, filter, pageSubscription, user, durable, temporary, autoCreated, routingType, maxConsumers, exclusive, null, null, purgeOnNoConsumers, false, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executor, server, factory); } public QueueImpl(final long id, @@ -447,6 +449,7 @@ public QueueImpl(final long id, final Integer consumersBeforeDispatch, final Long delayBeforeDispatch, final Boolean purgeOnNoConsumers, + final boolean configurationManaged, final ScheduledExecutorService scheduledExecutor, final PostOffice postOffice, final StorageManager storageManager, @@ -486,6 +489,8 @@ public QueueImpl(final long id, this.delayBeforeDispatch = delayBeforeDispatch == null ? ActiveMQDefaultConfiguration.getDefaultDelayBeforeDispatch() : delayBeforeDispatch; + this.configurationManaged = configurationManaged; + this.postOffice = postOffice; this.storageManager = storageManager; @@ -662,6 +667,16 @@ public synchronized void setMaxConsumer(int maxConsumers) { this.maxConsumers = maxConsumers; } + @Override + public boolean isConfigurationManaged() { + return configurationManaged; + } + + @Override + public synchronized void setConfigurationManaged(boolean configurationManaged) { + this.configurationManaged = configurationManaged; + } + @Override public SimpleString getName() { return name; diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/ScheduledDeliveryHandlerTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/ScheduledDeliveryHandlerTest.java index b21781d2ab8..3561e6f13e1 100644 --- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/ScheduledDeliveryHandlerTest.java +++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/ScheduledDeliveryHandlerTest.java @@ -833,6 +833,16 @@ public void setMaxConsumer(int maxConsumers) { } + @Override + public boolean isConfigurationManaged() { + return false; + } + + @Override + public void setConfigurationManaged(boolean configurationManaged) { + + } + @Override public void recheckRefCount(OperationContext context) { } diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jms/RedeployTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jms/RedeployTest.java index 07bc22e2a28..cec56a0b071 100644 --- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jms/RedeployTest.java +++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jms/RedeployTest.java @@ -320,8 +320,15 @@ public void run() { embeddedActiveMQ.getActiveMQServer().getReloadManager().setTick(tick); + ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); + try (JMSContext jmsContext = connectionFactory.createContext()) { + jmsContext.createSharedDurableConsumer(jmsContext.createTopic("config_test_consumer_created_queues"),"mySub").receive(100); + } + try { latch.await(10, TimeUnit.SECONDS); + Assert.assertTrue(listQueuesNamesForAddress(embeddedActiveMQ, "config_test_consumer_created_queues").contains("mySub")); + Assert.assertNotNull(getAddressInfo(embeddedActiveMQ, "config_test_address_removal_no_queue")); Assert.assertNotNull(getAddressInfo(embeddedActiveMQ, "config_test_address_removal")); Assert.assertNotNull(getAddressInfo(embeddedActiveMQ, "config_test_queue_removal")); @@ -344,6 +351,9 @@ public void run() { embeddedActiveMQ.getActiveMQServer().getReloadManager().setTick(tick); latch.await(10, TimeUnit.SECONDS); + //Ensure queues created by clients (NOT by broker.xml are not removed when we reload). + Assert.assertTrue(listQueuesNamesForAddress(embeddedActiveMQ, "config_test_consumer_created_queues").contains("mySub")); + Assert.assertNull(getAddressInfo(embeddedActiveMQ, "config_test_address_removal_no_queue")); Assert.assertNull(getAddressInfo(embeddedActiveMQ, "config_test_address_removal")); Assert.assertNotNull(getAddressInfo(embeddedActiveMQ, "config_test_queue_removal")); diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/QueueControlUsingCoreTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/QueueControlUsingCoreTest.java index 0a62334fafe..26ada034f90 100644 --- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/QueueControlUsingCoreTest.java +++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/QueueControlUsingCoreTest.java @@ -146,6 +146,11 @@ public boolean isPurgeOnNoConsumers() { return (Boolean) proxy.retrieveAttributeValue("purgeOnNoConsumers"); } + @Override + public boolean isConfigurationManaged() { + return (Boolean) proxy.retrieveAttributeValue("configurationManaged"); + } + @Override public boolean isExclusive() { return (Boolean) proxy.retrieveAttributeValue("exclusive"); diff --git a/tests/integration-tests/src/test/resources/reload-address-queues-updated.xml b/tests/integration-tests/src/test/resources/reload-address-queues-updated.xml index f8d1d918109..fd73f11db9e 100644 --- a/tests/integration-tests/src/test/resources/reload-address-queues-updated.xml +++ b/tests/integration-tests/src/test/resources/reload-address-queues-updated.xml @@ -117,6 +117,10 @@ under the License. +
+ + +
diff --git a/tests/integration-tests/src/test/resources/reload-address-queues.xml b/tests/integration-tests/src/test/resources/reload-address-queues.xml index ebd0f4e9bf5..74c9d08f6cd 100644 --- a/tests/integration-tests/src/test/resources/reload-address-queues.xml +++ b/tests/integration-tests/src/test/resources/reload-address-queues.xml @@ -120,6 +120,10 @@ under the License. +
+ + +
diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/FakeQueue.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/FakeQueue.java index 5297ab62093..7c1297debd8 100644 --- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/FakeQueue.java +++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/FakeQueue.java @@ -105,6 +105,16 @@ public void setMaxConsumer(int maxConsumers) { } + @Override + public boolean isConfigurationManaged() { + return false; + } + + @Override + public void setConfigurationManaged(boolean configurationManaged) { + + } + @Override public boolean isInternalQueue() { // no-op diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakePostOffice.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakePostOffice.java index 0bbe8efeec8..5f128ead7d7 100644 --- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakePostOffice.java +++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakePostOffice.java @@ -53,7 +53,8 @@ public QueueBinding updateQueue(SimpleString name, Boolean exclusive, Integer consumersBeforeDispatch, Long delayBeforeDispatch, - SimpleString user) throws Exception { + SimpleString user, + Boolean configurationManaged) throws Exception { return null; }