[ 
https://issues.apache.org/jira/browse/ARTEMIS-4212?focusedWorklogId=855742&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-855742
 ]

ASF GitHub Bot logged work on ARTEMIS-4212:
-------------------------------------------

                Author: ASF GitHub Bot
            Created on: 10/Apr/23 09:15
            Start Date: 10/Apr/23 09:15
    Worklog Time Spent: 10m 
      Work Description: gemmellr commented on code in PR #4421:
URL: https://github.com/apache/activemq-artemis/pull/4421#discussion_r1161555436


##########
artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/AddressQueryImpl.java:
##########
@@ -133,4 +141,14 @@ public Integer getDefaultConsumersBeforeDispatch() {
    public Long getDefaultDelayBeforeDispatch() {
       return defaultDelayBeforeDispatch;
    }
+
+   @Override
+   public Boolean isSupportsMulticast() {
+      return supportsMulticast;
+   }
+
+   @Override
+   public Boolean isSupportsAnycast() {
+      return supportsAnycast;
+   }

Review Comment:
   Using primitive boolean may be nicer for the method returns, even if using 
Boolean for the field? Doesnt seem like any of the usage would actually handle 
a null being returned. Isnt clear it really needs 'presence' detection offered 
by use of Boolean field either (could use 'boolean hasSupportsMulticast()' 
style detection later though if ever so)



##########
artemis-server/src/main/java/org/apache/activemq/artemis/core/security/impl/SecurityStoreImpl.java:
##########
@@ -304,6 +304,7 @@ public void check(final SimpleString address,
             if (bareQueue == null) {
                ex = 
ActiveMQMessageBundle.BUNDLE.userNoPermissions(session.getUsername(), 
checkType, bareAddress);
             } else {
+               new Exception("trace").printStackTrace();

Review Comment:
   Leftover debug stacktrace



##########
artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java:
##########
@@ -3943,6 +3943,7 @@ public Queue createQueue(final QueueConfiguration 
queueConfiguration) throws Exc
 
    @Override
    public Queue createQueue(final QueueConfiguration queueConfiguration, 
boolean ignoreIfExists) throws Exception {
+//      new Exception("trace").printStackTrace();

Review Comment:
   commented out debug stacktrace



##########
tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jms/multiprotocol/JMSMismatchedRoutingTypeTest.java:
##########
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.artemis.tests.integration.jms.multiprotocol;
+
+import javax.jms.Connection;
+import javax.jms.InvalidDestinationException;
+import javax.jms.JMSException;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+import javax.jms.Topic;
+
+import org.apache.activemq.artemis.api.core.QueueConfiguration;
+import org.apache.activemq.artemis.api.core.RoutingType;
+import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.core.server.ActiveMQServer;
+import org.apache.activemq.artemis.core.server.impl.AddressInfo;
+import org.apache.activemq.artemis.jms.client.ActiveMQConnection;
+import org.apache.activemq.artemis.tests.util.RandomUtil;
+import org.junit.Test;
+
+public class JMSMismatchedRoutingTypeTest extends 
MultiprotocolJMSClientTestSupport {
+
+   protected final String ANYCAST_ADDRESS = RandomUtil.randomString();
+   protected final String MULTICAST_ADDRESS = RandomUtil.randomString();
+
+   @Override
+   protected boolean isAutoCreateAddresses() {
+      return false;
+   }
+
+   @Override
+   protected boolean isAutoCreateQueues() {
+      return false;
+   }
+
+   @Override
+   protected void createAddressAndQueues(ActiveMQServer server) throws 
Exception {
+      server.addAddressInfo(new 
AddressInfo(SimpleString.toSimpleString(ANYCAST_ADDRESS), RoutingType.ANYCAST));
+      server.createQueue(new 
QueueConfiguration(RandomUtil.randomString()).setAddress(ANYCAST_ADDRESS).setRoutingType(RoutingType.ANYCAST));
+
+      server.addAddressInfo(new 
AddressInfo(SimpleString.toSimpleString(MULTICAST_ADDRESS), 
RoutingType.MULTICAST));
+      server.createQueue(new 
QueueConfiguration(RandomUtil.randomString()).setAddress(MULTICAST_ADDRESS).setRoutingType(RoutingType.MULTICAST));
+   }
+
+   @Test
+   public void testSendingMulticastToAnycastAMQP() throws Exception {
+      internalTestSendingMulticastToAnycast(AMQPConnection);
+   }
+
+   @Test
+   public void testSendingMulticastToAnycastCore() throws Exception {
+      internalTestSendingMulticastToAnycast(CoreConnection);
+   }
+
+   @Test
+   public void testSendingMulticastToAnycastOpenWire() throws Exception {
+      internalTestSendingMulticastToAnycast(OpenWireConnection);
+   }
+
+   private void internalTestSendingMulticastToAnycast(ConnectionSupplier 
connectionSupplier) throws Exception {
+      Connection connection = connectionSupplier.createConnection();
+      Session s = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+      Topic topic = s.createTopic(ANYCAST_ADDRESS);
+      try {
+         MessageProducer producer = s.createProducer(topic);
+         producer.send(s.createMessage());
+         fail("Sending message here should fail!");
+      } catch (InvalidDestinationException e) {
+         // expected
+      }
+   }
+
+   @Test
+   public void testSendingAnycastToMulticastAMQP() throws Exception {
+      internalTestSendingAnycastToMulticast(AMQPConnection);
+   }
+
+   @Test
+   public void testSendingAnycastToMulticastCore() throws Exception {
+      internalTestSendingAnycastToMulticast(CoreConnection);
+   }
+
+   @Test
+   public void testSendingAnycastToMulticastOpenWire() throws Exception {
+      internalTestSendingAnycastToMulticast(OpenWireConnection);
+   }
+
+   private void internalTestSendingAnycastToMulticast(ConnectionSupplier 
connectionSupplier) throws Exception {
+      Connection connection = connectionSupplier.createConnection();
+      Session s = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+      Queue q;
+      try {
+         // when using core this will fail because the client actually checks 
for the queue on the broker (which won't be there)
+         q = s.createQueue(MULTICAST_ADDRESS);
+      } catch (JMSException e) {
+         if (connection instanceof ActiveMQConnection) {
+            // expected
+            return;
+         } else {
+            throw e;
+         }
+      }
+      try {
+         MessageProducer producer = s.createProducer(q);
+         producer.send(s.createMessage());
+         fail("Sending message here should fail!");
+      } catch (InvalidDestinationException e) {
+         // expected
+      }
+   }

Review Comment:
   Should clean up connection.



##########
tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jms/multiprotocol/JMSMismatchedRoutingTypeTest.java:
##########
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.artemis.tests.integration.jms.multiprotocol;
+
+import javax.jms.Connection;
+import javax.jms.InvalidDestinationException;
+import javax.jms.JMSException;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+import javax.jms.Topic;
+
+import org.apache.activemq.artemis.api.core.QueueConfiguration;
+import org.apache.activemq.artemis.api.core.RoutingType;
+import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.core.server.ActiveMQServer;
+import org.apache.activemq.artemis.core.server.impl.AddressInfo;
+import org.apache.activemq.artemis.jms.client.ActiveMQConnection;
+import org.apache.activemq.artemis.tests.util.RandomUtil;
+import org.junit.Test;
+
+public class JMSMismatchedRoutingTypeTest extends 
MultiprotocolJMSClientTestSupport {
+
+   protected final String ANYCAST_ADDRESS = RandomUtil.randomString();
+   protected final String MULTICAST_ADDRESS = RandomUtil.randomString();
+
+   @Override
+   protected boolean isAutoCreateAddresses() {
+      return false;
+   }
+
+   @Override
+   protected boolean isAutoCreateQueues() {
+      return false;
+   }
+
+   @Override
+   protected void createAddressAndQueues(ActiveMQServer server) throws 
Exception {
+      server.addAddressInfo(new 
AddressInfo(SimpleString.toSimpleString(ANYCAST_ADDRESS), RoutingType.ANYCAST));
+      server.createQueue(new 
QueueConfiguration(RandomUtil.randomString()).setAddress(ANYCAST_ADDRESS).setRoutingType(RoutingType.ANYCAST));
+
+      server.addAddressInfo(new 
AddressInfo(SimpleString.toSimpleString(MULTICAST_ADDRESS), 
RoutingType.MULTICAST));
+      server.createQueue(new 
QueueConfiguration(RandomUtil.randomString()).setAddress(MULTICAST_ADDRESS).setRoutingType(RoutingType.MULTICAST));
+   }
+
+   @Test
+   public void testSendingMulticastToAnycastAMQP() throws Exception {
+      internalTestSendingMulticastToAnycast(AMQPConnection);
+   }
+
+   @Test
+   public void testSendingMulticastToAnycastCore() throws Exception {
+      internalTestSendingMulticastToAnycast(CoreConnection);
+   }
+
+   @Test
+   public void testSendingMulticastToAnycastOpenWire() throws Exception {
+      internalTestSendingMulticastToAnycast(OpenWireConnection);
+   }
+
+   private void internalTestSendingMulticastToAnycast(ConnectionSupplier 
connectionSupplier) throws Exception {
+      Connection connection = connectionSupplier.createConnection();
+      Session s = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+      Topic topic = s.createTopic(ANYCAST_ADDRESS);
+      try {
+         MessageProducer producer = s.createProducer(topic);
+         producer.send(s.createMessage());
+         fail("Sending message here should fail!");
+      } catch (InvalidDestinationException e) {
+         // expected
+      }
+   }

Review Comment:
   Should clean up connection.





Issue Time Tracking
-------------------

    Worklog Id:     (was: 855742)
    Time Spent: 40m  (was: 0.5h)

> Unexpected Behavior when Routing Type of Destinations Doesn't Match Clients
> ---------------------------------------------------------------------------
>
>                 Key: ARTEMIS-4212
>                 URL: https://issues.apache.org/jira/browse/ARTEMIS-4212
>             Project: ActiveMQ Artemis
>          Issue Type: Improvement
>            Reporter: Justin Bertram
>            Assignee: Justin Bertram
>            Priority: Major
>          Time Spent: 40m
>  Remaining Estimate: 0h
>
> When the routing type of an address (and associated queue) does not match the 
> routing type of a client producer, the resultant behavior is a bit unexpected.
> Expected Behavior:
> If a client sends a message to an address / queue with the same name, but a 
> different routing type, the expected behavior would be to throw some sort of 
> InvalidDestinationException (if auto-create is not enabled), or to create the 
> matching address and queue with the appropriate routing type. The routing 
> count on the existing address (with non-matching routing type) should remain 
> unchanged.
> Actual Behavior:
> When sending, for example, to a predefined anycast address and queue from a 
> multiccast (Topic) producer, the routed count on the address is incremented, 
> but the message count on the matching queue is not. No indication is given at 
> the client end that the messages failed to get routed - they are silently 
> dropped.
> This is reproducible using a qpid / proton queue producer to send to a 
> multicast address or using a topic producer to send to an anycast address, 
> e.g.:
> 1. Create a a broker, setting auto-create-queues and auto-create addresses to 
> "false" for the catch-all address-setting
> 2. Start the broker and create a an address and matching queue with a ANYCAST 
> routing type
> 3. Send 1000 messages to the broker using the same queue name but mismatched 
> routing type:
> {code}
> ./artemis producer --url amqp://localhost:61616 --user admin --password admin 
> --destination topic://{QUEUE NAME} --protocol amqp
> {code}
> No error is emitted and the routing count is incremented by 1000 at the 
> address level, but remains unchanged at the destination level.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to