diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/AutoCreatedQueueManagerImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/AutoCreatedQueueManagerImpl.java index b6b5508e3f..b57ae47244 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/AutoCreatedQueueManagerImpl.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/AutoCreatedQueueManagerImpl.java @@ -36,16 +36,17 @@ public class AutoCreatedQueueManagerImpl implements AutoCreatedQueueManager { Queue queue = server.locateQueue(queueName); long consumerCount = queue.getConsumerCount(); long messageCount = queue.getMessageCount(); + boolean isAutoDeleteJmsQueues = server.getAddressSettingsRepository().getMatch(queueName.toString()).isAutoDeleteJmsQueues(); - if (server.locateQueue(queueName).getMessageCount() == 0) { + if (server.locateQueue(queueName).getMessageCount() == 0 && isAutoDeleteJmsQueues) { if (ActiveMQServerLogger.LOGGER.isDebugEnabled()) { - ActiveMQServerLogger.LOGGER.debug("deleting auto-created queue \"" + queueName + "\" because consumerCount = " + consumerCount + " and messageCount = " + messageCount); + ActiveMQServerLogger.LOGGER.debug("deleting auto-created queue \"" + queueName + ".\" consumerCount = " + consumerCount + "; messageCount = " + messageCount + "; isAutoDeleteJmsQueues = " + isAutoDeleteJmsQueues); } server.destroyQueue(queueName, null, false); } else if (ActiveMQServerLogger.LOGGER.isDebugEnabled()) { - ActiveMQServerLogger.LOGGER.debug("NOT deleting auto-created queue \"" + queueName + "\" because consumerCount = " + consumerCount + " and messageCount = " + messageCount); + ActiveMQServerLogger.LOGGER.debug("NOT deleting auto-created queue \"" + queueName + ".\" consumerCount = " + consumerCount + "; messageCount = " + messageCount + "; isAutoDeleteJmsQueues = " + isAutoDeleteJmsQueues); } } catch (Exception e) { diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AutoDeleteJmsQueueTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AutoDeleteJmsQueueTest.java index 018667e9ba..b120b29363 100644 --- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AutoDeleteJmsQueueTest.java +++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AutoDeleteJmsQueueTest.java @@ -25,6 +25,7 @@ import javax.jms.TextMessage; import org.apache.activemq.artemis.api.core.SimpleString; import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient; +import org.apache.activemq.artemis.core.settings.impl.AddressSettings; import org.apache.activemq.artemis.tests.util.JMSTestBase; import org.apache.activemq.artemis.core.server.Queue; import org.junit.Assert; @@ -75,4 +76,49 @@ public class AutoDeleteJmsQueueTest extends JMSTestBase { // ensure the queue was removed Assert.assertNull(server.getPostOffice().getBinding(new SimpleString("jms.queue.test"))); } + + @Test + public void testAutoDeleteNegative() throws Exception { + server.getAddressSettingsRepository().addMatch("#", new AddressSettings().setAutoDeleteJmsQueues(false)); + Connection connection = cf.createConnection(); + Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); + + javax.jms.Queue queue = ActiveMQJMSClient.createQueue("test"); + + MessageProducer producer = session.createProducer(queue); + + final int numMessages = 100; + + for (int i = 0; i < numMessages; i++) { + TextMessage mess = session.createTextMessage("msg" + i); + producer.send(mess); + } + + producer.close(); + + MessageConsumer messageConsumer = session.createConsumer(queue); + connection.start(); + + for (int i = 0; i < numMessages - 1; i++) { + Message m = messageConsumer.receive(5000); + Assert.assertNotNull(m); + } + + session.close(); + + // ensure the queue is still there + Queue q = (Queue) server.getPostOffice().getBinding(new SimpleString("jms.queue.test")).getBindable(); + Assert.assertEquals(1, q.getMessageCount()); + Assert.assertEquals(numMessages, q.getMessagesAdded()); + + session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); + messageConsumer = session.createConsumer(queue); + Message m = messageConsumer.receive(5000); + Assert.assertNotNull(m); + + connection.close(); + + // ensure the queue was not removed + Assert.assertNotNull(server.getPostOffice().getBinding(new SimpleString("jms.queue.test"))); + } }