diff --git 
a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPSessionCallback.java
 
b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPSessionCallback.java
index 0e2cf6dfcb..c3643873a6 100644
--- 
a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPSessionCallback.java
+++ 
b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPSessionCallback.java
@@ -278,8 +278,11 @@ public QueueQueryResult queueQuery(SimpleString queueName, 
RoutingType routingTy
       }
 
       // if auto-create we will return whatever type was used before
-      if (queueQueryResult.isExists() && !queueQueryResult.isAutoCreated() && 
queueQueryResult.getRoutingType() != routingType) {
-         throw new IllegalStateException("Incorrect Routing Type for queue, 
expecting: " + routingType);
+      if (queueQueryResult.isExists() && !queueQueryResult.isAutoCreated()) {
+         //if routingType is null we bypass the check
+         if (routingType != null && queueQueryResult.getRoutingType() != 
routingType) {
+            throw new IllegalStateException("Incorrect Routing Type for queue, 
expecting: " + routingType);
+         }
       }
 
       return queueQueryResult;
diff --git 
a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerSenderContext.java
 
b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerSenderContext.java
index 4caf2d0047..ea8475f3a1 100644
--- 
a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerSenderContext.java
+++ 
b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerSenderContext.java
@@ -348,7 +348,10 @@ public void initialise() throws Exception {
             if (multicast && !routingTypes.contains(RoutingType.MULTICAST)) {
                throw new ActiveMQAMQPIllegalStateException("Address " + 
addressToUse + " is not configured for topic support");
             } else if (!multicast && 
!routingTypes.contains(RoutingType.ANYCAST)) {
-               throw new ActiveMQAMQPIllegalStateException("Address " + 
addressToUse + " is not configured for queue support");
+               //if client specifies fully qualified name that's allowed, 
don't throw exception.
+               if (queueNameToUse == null) {
+                  throw new ActiveMQAMQPIllegalStateException("Address " + 
addressToUse + " is not configured for queue support");
+               }
             }
          } else {
             // if not we look up the address
@@ -446,7 +449,10 @@ public void initialise() throws Exception {
             }
          } else {
             if (queueNameToUse != null) {
-               SimpleString matchingAnycastQueue = 
getMatchingQueue(queueNameToUse, addressToUse, RoutingType.ANYCAST);
+               //a queue consumer can receive from a multicast queue if it 
uses a fully qualified name
+               //setting routingType to null means do not check the 
routingType against the Queue's routing type.
+               routingTypeToUse = null;
+               SimpleString matchingAnycastQueue = 
getMatchingQueue(queueNameToUse, addressToUse, null);
                if (matchingAnycastQueue != null) {
                   queue = matchingAnycastQueue;
                } else {
diff --git 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpFullyQualifiedNameTest.java
 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpFullyQualifiedNameTest.java
index 1bcf9e16e2..d8c7b2fdc0 100644
--- 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpFullyQualifiedNameTest.java
+++ 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpFullyQualifiedNameTest.java
@@ -202,6 +202,40 @@ public void testTopic() throws Exception {
       }
    }
 
+   @Test
+   public void testQueueConsumerReceiveTopicUsingFQQN() throws Exception {
+
+      SimpleString queueName1 = new SimpleString("sub.queue1");
+      SimpleString queueName2 = new SimpleString("sub.queue2");
+      server.createQueue(multicastAddress, RoutingType.MULTICAST, queueName1, 
null, false, false);
+      server.createQueue(multicastAddress, RoutingType.MULTICAST, queueName2, 
null, false, false);
+      Connection connection = createConnection(false);
+
+      try {
+         connection.start();
+         Session session = connection.createSession(false, 
Session.AUTO_ACKNOWLEDGE);
+         javax.jms.Queue fqqn1 = 
session.createQueue(multicastAddress.toString() + "::" + queueName1);
+         javax.jms.Queue fqqn2 = 
session.createQueue(multicastAddress.toString() + "::" + queueName2);
+
+         MessageConsumer consumer1 = session.createConsumer(fqqn1);
+         MessageConsumer consumer2 = session.createConsumer(fqqn2);
+
+         Topic topic = session.createTopic(multicastAddress.toString());
+         MessageProducer producer = session.createProducer(topic);
+
+         producer.send(session.createMessage());
+
+         Message m = consumer1.receive(2000);
+         assertNotNull(m);
+
+         m = consumer2.receive(2000);
+         assertNotNull(m);
+
+      } finally {
+         connection.close();
+      }
+   }
+
    @Test
    public void testQueue() throws Exception {
       server.createQueue(anycastAddress, RoutingType.ANYCAST, anycastQ1, null, 
true, false, -1, false, true);


With regards,
Apache Git Services

Reply via email to