This is an automated email from the ASF dual-hosted git repository.

clebertsuconic pushed a commit to branch 2.6.x
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git


The following commit(s) were added to refs/heads/2.6.x by this push:
     new 7a139a4  ARTEMIS-2238 Fixing QueueQuery on every single send on topics
7a139a4 is described below

commit 7a139a41e5b801051d3845b72dc610c79cb420c8
Author: Clebert Suconic <clebertsuco...@apache.org>
AuthorDate: Thu Jan 24 13:38:31 2019 -0500

    ARTEMIS-2238 Fixing QueueQuery on every single send on topics
    
    (cherry picked from commit 90a66266b67cc1c0ee964d33b5ac3608cda921e8)
---
 .../jms/client/ActiveMQMessageProducer.java        | 11 +++++----
 .../integration/amqp/QueueAutoCreationTest.java    | 28 ++++++++++++++++++++--
 2 files changed, 32 insertions(+), 7 deletions(-)

diff --git 
a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQMessageProducer.java
 
b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQMessageProducer.java
index ae1d270..1148220 100644
--- 
a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQMessageProducer.java
+++ 
b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQMessageProducer.java
@@ -421,16 +421,17 @@ public class ActiveMQMessageProducer implements 
MessageProducer, QueueSender, To
                      throw new InvalidDestinationException("Destination " + 
address + " does not exist");
                   }
                } else {
-                  ClientSession.QueueQuery queueQuery = 
clientSession.queueQuery(address);
-                  if (queueQuery.isExists()) {
-                     connection.addKnownDestination(address);
-                  } else if (destination.isQueue() && 
query.isAutoCreateQueues()) {
+                  if (destination.isQueue()) {ClientSession.QueueQuery 
queueQuery = clientSession.queueQuery(address);
+                  if (!queueQuery.isExists()) {
+
                      if (destination.isTemporary()) {
                         clientSession.createTemporaryQueue(address, 
RoutingType.ANYCAST, address);
                      } else {
-                        createQueue(destination, RoutingType.ANYCAST, address, 
null, true, true, query.getDefaultMaxConsumers(), 
query.isDefaultPurgeOnNoConsumers(), query.isDefaultExclusive(), 
query.isDefaultLastValueQueue());
+                        createQueue(destination, RoutingType.ANYCAST, address, 
null, true, true, query.getDefaultMaxConsumers(), 
query.isDefaultPurgeOnNoConsumers(), query.isDefaultExclusive(), 
query.isDefaultLastValueQueue());}
                      }
                   }
+
+                  connection.addKnownDestination(address);
                }
             } catch (ActiveMQQueueExistsException e) {
                // The queue was created by another client/admin between the 
query check and send create queue packet
diff --git 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/QueueAutoCreationTest.java
 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/QueueAutoCreationTest.java
index f6c8b22..5d87f11 100644
--- 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/QueueAutoCreationTest.java
+++ 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/QueueAutoCreationTest.java
@@ -24,7 +24,9 @@ import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.core.server.JournalType;
 import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
 import org.apache.activemq.artemis.jms.client.ActiveMQConnection;
+import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
 import org.apache.activemq.artemis.jms.client.ActiveMQQueue;
+import org.apache.activemq.artemis.jms.client.ActiveMQTopic;
 import org.apache.activemq.artemis.utils.UUIDGenerator;
 import org.junit.After;
 import org.junit.Assert;
@@ -32,6 +34,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
 import javax.jms.DeliveryMode;
 import javax.jms.JMSException;
 import javax.jms.MessageConsumer;
@@ -39,6 +42,7 @@ import javax.jms.MessageProducer;
 import javax.jms.Queue;
 import javax.jms.Session;
 import javax.jms.TextMessage;
+import javax.jms.Topic;
 import java.math.BigInteger;
 import java.util.Map;
 import java.util.Random;
@@ -58,7 +62,7 @@ public class QueueAutoCreationTest extends 
JMSClientTestSupport {
       String randomSuffix = new BigInteger(130, random).toString(32);
       testConn = (ActiveMQConnection)createCoreConnection();
       clientSession = testConn.getSessionFactory().createSession();
-      queue1 = createQueue("queue1_" + randomSuffix);
+      queue1 = createAddressOnlyAndFakeQueue("queue1_" + randomSuffix);
    }
 
    @Override
@@ -89,7 +93,7 @@ public class QueueAutoCreationTest extends 
JMSClientTestSupport {
    }
 
 
-   protected Queue createQueue(final String queueName) throws Exception {
+   protected Queue createAddressOnlyAndFakeQueue(final String queueName) 
throws Exception {
       SimpleString address = SimpleString.toSimpleString(queueName);
       clientSession.createAddress(address, RoutingType.ANYCAST, false);
       return new ActiveMQQueue(queueName);
@@ -109,6 +113,26 @@ public class QueueAutoCreationTest extends 
JMSClientTestSupport {
       sendStringOfSize(1024 * 1024, true);
    }
 
+
+   @Test(timeout = 30000)
+   // QueueAutoCreationTest was created to validate auto-creation of queues
+   // and this test was added to validate a regression: 
https://issues.apache.org/jira/browse/ARTEMIS-2238
+   public void testAutoCreateOnTopic() throws Exception {
+      ConnectionFactory factory = new 
ActiveMQConnectionFactory("tcp://localhost:5672");
+      Connection connection = factory.createConnection();
+      SimpleString addressName = 
UUIDGenerator.getInstance().generateSimpleStringUUID();
+      System.out.println("Address is " + addressName);
+      clientSession.createAddress(addressName, RoutingType.ANYCAST, false);
+      Topic topic = new ActiveMQTopic(addressName.toString());
+      Session session = connection.createSession(false, 
Session.AUTO_ACKNOWLEDGE);
+      MessageProducer producer = session.createProducer(topic);
+      for (int i = 0; i < 10; i++) {
+         producer.send(session.createTextMessage("hello"));
+      }
+
+      
Assert.assertTrue(((ActiveMQConnection)connection).containsKnownDestination(addressName));
+   }
+
    private void sendStringOfSize(int msgSize, boolean useCoreReceive) throws 
JMSException {
 
       Connection conn = this.createConnection();

Reply via email to