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 {

Reply via email to