ARTEMIS-1818 re-create auto-created queue on JMS reconnect
Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/d6adc295 Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/d6adc295 Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/d6adc295 Branch: refs/heads/master Commit: d6adc2950a3a7b988ae2440027deaf604800ff09 Parents: 9b13f5c Author: Justin Bertram <jbert...@apache.org> Authored: Thu Apr 19 14:42:39 2018 -0500 Committer: Clebert Suconic <clebertsuco...@apache.org> Committed: Thu Apr 26 09:59:47 2018 -0400 ---------------------------------------------------------------------- .../core/impl/ActiveMQSessionContext.java | 9 ++++---- .../client/AutoCreateJmsDestinationTest.java | 23 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d6adc295/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQSessionContext.java ---------------------------------------------------------------------- diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQSessionContext.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQSessionContext.java index f4033ec..fccb041 100644 --- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQSessionContext.java +++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQSessionContext.java @@ -766,11 +766,10 @@ public class ActiveMQSessionContext extends SessionContext { boolean isSessionStarted) throws ActiveMQException { ClientSession.QueueQuery queueInfo = consumerInternal.getQueueInfo(); - // We try and recreate any non durable queues, since they probably won't be there unless - // they are defined in broker.xml - // This allows e.g. JMS non durable subs and temporary queues to continue to be used after failover - if (!queueInfo.isDurable()) { - CreateQueueMessage_V2 createQueueRequest = new CreateQueueMessage_V2(queueInfo.getAddress(), queueInfo.getName(), queueInfo.getRoutingType(), queueInfo.getFilterString(), false, queueInfo.isTemporary(), queueInfo.getMaxConsumers(), queueInfo.isPurgeOnNoConsumers(), queueInfo.isAutoCreated(), false, queueInfo.isExclusive(), queueInfo.isLastValue()); + // We try to recreate any non-durable or auto-created queues, since they might not be there on failover/reconnect. + // This allows e.g. JMS non durable subs and temporary queues to continue to be used after failover/reconnection + if (!queueInfo.isDurable() || queueInfo.isAutoCreated()) { + CreateQueueMessage_V2 createQueueRequest = new CreateQueueMessage_V2(queueInfo.getAddress(), queueInfo.getName(), queueInfo.getRoutingType(), queueInfo.getFilterString(), queueInfo.isDurable(), queueInfo.isTemporary(), queueInfo.getMaxConsumers(), queueInfo.isPurgeOnNoConsumers(), queueInfo.isAutoCreated(), false, queueInfo.isExclusive(), queueInfo.isLastValue()); sendPacketWithoutLock(sessionChannel, createQueueRequest); } http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/d6adc295/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AutoCreateJmsDestinationTest.java ---------------------------------------------------------------------- diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AutoCreateJmsDestinationTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AutoCreateJmsDestinationTest.java index a980878..3094c59 100644 --- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AutoCreateJmsDestinationTest.java +++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AutoCreateJmsDestinationTest.java @@ -33,6 +33,7 @@ import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient; import org.apache.activemq.artemis.core.security.Role; import org.apache.activemq.artemis.core.server.Queue; import org.apache.activemq.artemis.jms.client.ActiveMQTemporaryTopic; +import org.apache.activemq.artemis.junit.Wait; import org.apache.activemq.artemis.spi.core.security.ActiveMQJAASSecurityManager; import org.apache.activemq.artemis.tests.integration.IntegrationTestLogger; import org.apache.activemq.artemis.tests.util.JMSTestBase; @@ -242,6 +243,28 @@ public class AutoCreateJmsDestinationTest extends JMSTestBase { assertNull(server.locateQueue(topicAddress)); } + @Test + public void testAutoCreateOnReconnect() throws Exception { + Connection connection = cf.createConnection(); + connection.start(); + Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); + + javax.jms.Queue queue = ActiveMQJMSClient.createQueue(QUEUE_NAME); + + MessageConsumer consumer = session.createConsumer(queue); + MessageProducer producer = session.createProducer(queue); + producer.send(session.createMessage()); + assertNotNull(consumer.receive(500)); + server.stop(); + server.start(); + waitForServerToStart(server); + // wait for client to reconnect + assertTrue(Wait.waitFor(() -> server.getTotalConsumerCount() == 1, 3000, 100)); + producer.send(session.createMessage()); + assertNotNull(consumer.receive(500)); + connection.close(); + } + @Before @Override public void setUp() throws Exception {