[ 
https://issues.apache.org/jira/browse/ARTEMIS-4787?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Josh Byster updated ARTEMIS-4787:
---------------------------------
    Description: 
As a preface, I am aware that creating both anycast and multicast queues on the 
same address are 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;

    protected ClientSession session;

    protected ClientSessionFactory sf;

    protected ServerLocator locator;

    @Override
    @Before
    public void setUp() throws Exception {
        super.setUp();
        server = createServer(true, createDefaultNettyConfig(), 
AddressSettings.DEFAULT_PAGE_SIZE, AddressSettings.DEFAULT_MAX_SIZE_BYTES, -1, 
-1, new HashMap<>());
        server.start();
        locator = createInVMNonHALocator();
        sf = createSessionFactory(locator);
        session = addClientSession(sf.createSession(false, true, true));
    }

    @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}


  was:
As a preface, I am aware that creating both anycast and multicast queues on the 
same address are 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;

    protected ClientSession session;

    protected ClientSessionFactory sf;

    protected ServerLocator locator;

    @Override
    @Before
    public void setUp() throws Exception {
        super.setUp();
        server = createServer(true, createDefaultNettyConfig(), 
AddressSettings.DEFAULT_PAGE_SIZE, AddressSettings.DEFAULT_MAX_SIZE_BYTES, -1, 
-1, new HashMap<>());
        server.start();
        locator = createInVMNonHALocator();
        sf = createSessionFactory(locator);
        session = addClientSession(sf.createSession(false, true, true));
    }

    @Test
    public void testConsumerKick() 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}



> 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
>
> As a preface, I am aware that creating both anycast and multicast queues on 
> the same address are 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;
>     protected ClientSession session;
>     protected ClientSessionFactory sf;
>     protected ServerLocator locator;
>     @Override
>     @Before
>     public void setUp() throws Exception {
>         super.setUp();
>         server = createServer(true, createDefaultNettyConfig(), 
> AddressSettings.DEFAULT_PAGE_SIZE, AddressSettings.DEFAULT_MAX_SIZE_BYTES, 
> -1, -1, new HashMap<>());
>         server.start();
>         locator = createInVMNonHALocator();
>         sf = createSessionFactory(locator);
>         session = addClientSession(sf.createSession(false, true, true));
>     }
>     @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