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

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

                Author: ASF GitHub Bot
            Created on: 03/Jun/24 20:18
            Start Date: 03/Jun/24 20:18
    Worklog Time Spent: 10m 
      Work Description: jbertram opened a new pull request, #4957:
URL: https://github.com/apache/activemq-artemis/pull/4957

   There's an edge-case in the auto-creation logic for anycast queues that 
checks to see if any queue already exists on the address and if so then nothing 
further is created. It's not clear to me what use-case this is for, and it 
precludes the use-case detailed on ARTEMIS-4787 where a migrating user has 
overlapping names for JMS queues and topics.
       
   This commit removes this edge-case and adds a test to verify auto-creation 
works properly with both OpenWire and Core. The test includes methods for AMQP, 
but they are disabled since the AMQP protocol handler doesn't handle this 
use-case at all. This PR is specifically for OpenWire.




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

            Worklog Id:     (was: 921841)
    Remaining Estimate: 0h
            Time Spent: 10m

> Anycast queue does not auto-create if already multicast queue on same address
> -----------------------------------------------------------------------------
>
>                 Key: ARTEMIS-4787
>                 URL: https://issues.apache.org/jira/browse/ARTEMIS-4787
>             Project: ActiveMQ Artemis
>          Issue Type: Bug
>          Components: Broker
>            Reporter: Josh Byster
>            Priority: Major
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> As a preface, I am aware that creating both anycast and multicast queues on 
> the same address is an anti-pattern and not recommended. However, this is 
> causing difficulties migrating over legacy clients from using Classic to 
> Artemis.
> If one creates a JMS topic on an address, and then tries to create a JMS 
> queue, it fails to create. However, if the order is flipped (creating a 
> queue, then a topic), there is no exception.
> It seems like the issue is in this area of {{ServerSessionImpl}}:
> {code:java}
> Bindings bindings = 
> server.getPostOffice().lookupBindingsForAddress(unPrefixedAddress);
> if (bindings != null && bindings.hasLocalBinding() && !queueConfig.isFqqn()) {
>    // The address has another queue with a different name, which is fine. 
> Just ignore it.
>    result = AutoCreateResult.EXISTED;{code}
> Please see test below to reproduce, which throws the exception immediately as 
> seen in production.
> {code:java}
> package org.apache.activemq.artemis.tests.integration;
> import org.apache.activemq.artemis.api.core.client.ClientSession;
> import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
> import org.apache.activemq.artemis.api.core.client.ServerLocator;
> import org.apache.activemq.artemis.core.server.ActiveMQServer;
> import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
> import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
> import org.junit.Before;
> import org.junit.Test;
> import javax.jms.Connection;
> import javax.jms.ConnectionFactory;
> import javax.jms.MessageConsumer;
> import javax.jms.Queue;
> import javax.jms.Session;
> import javax.jms.Topic;
> import java.util.HashMap;
> public class QueueTopicSameNameTest extends ActiveMQTestBase {
>     protected ActiveMQServer server;
>     @Override
>     @Before
>     public void setUp() throws Exception {
>         super.setUp();
>         server = createServer(true, createDefaultNettyConfig());
>         server.start();
>     }
>     @Test
>     public void testTopicThenQueueCreate() throws Exception {
>         String myAddr = "TEST";
>         ConnectionFactory cf = new 
> org.apache.activemq.ActiveMQConnectionFactory("failover:(tcp://localhost:61616)");
>         Connection c = cf.createConnection();
>         Session s = c.createSession();
>         Topic t = s.createTopic(myAddr);
>         MessageConsumer consumer = s.createConsumer(t);
>         Queue q = s.createQueue(myAddr);
>         MessageConsumer otherConsumer = s.createConsumer(q);
>         c.close();
>     }
> }{code}



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

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information, visit: https://activemq.apache.org/contact


Reply via email to