Lukyanov Mikhail
Lukyanov Mikhail

Reputation: 525

Consumer with wildcard syntax

I'm using ActiveMQ Artemis 2.17.0. I want to create a consumer with wildcard syntax that would consume messages from multiple addresses. I wrote the next consumer. But it consumes from address news.europe.#, but not from addresses matching the wildcard syntax (news.europe.sport, news.europe.politics etc). What am I doing wrong?

Scenario:

  1. Start Artemis broker
  2. Send 2 messages with the producer in news.europe.sport, news.europe.politics
  3. Start the consumer

Expected behavior:

Observed behavior

import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;

import javax.jms.*;

public class ArtemisConsumer {

    public static void main(String[] args) throws JMSException, InterruptedException {

        String brokerURL = "tcp://localhost:61716";
        String queueName = "news.europe.#";
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);
        connectionFactory.setUser("user");
        connectionFactory.setPassword("pass");
        Connection connection = connectionFactory.createConnection();
        connection.start();
        Session session = connection.createSession(true, Session.SESSION_TRANSACTED);
        Destination destination = session.createQueue(queueName);
        MessageConsumer consumer = session.createConsumer(destination);
        consumer.setMessageListener(new ConsumerMessageListener("Consumer"));
        Thread.sleep(60000);
        session.commit();
        session.close();
        connection.close();
    }
}

broker.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="urn:activemq">
    <core xmlns="urn:activemq:core">

        <name>QMA</name>

        <max-disk-usage>100</max-disk-usage>

        <configuration-file-refresh-period>9223372036854775807</configuration-file-refresh-period>

        <bindings-directory>${ARTEMISMQ_DATA}/bindings</bindings-directory>

        <journal-directory>${ARTEMISMQ_DATA}/journal</journal-directory>

        <large-messages-directory>${ARTEMISMQ_DATA}/largemessages</large-messages-directory>

        <paging-directory>.${ARTEMISMQ_DATA}/paging</paging-directory>

        <cluster-user>user</cluster-user>

        <cluster-password>password</cluster-password>


        <!-- Acceptors -->
        <acceptors>
            <acceptor name="netty-acceptor">tcp://0.0.0.0:61716</acceptor>
            <acceptor name="in-vm">vm://0</acceptor>
        </acceptors>
        
        <security-settings>
            <security-setting match="#">
                <permission roles="user-group" type="createNonDurableQueue"/>
                <permission roles="user-group" type="deleteNonDurableQueue"/>
                <permission roles="user-group" type="createDurableQueue"/>
                <permission roles="user-group" type="deleteDurableQueue"/>
                <permission roles="user-group" type="createAddress"/>
                <permission roles="user-group" type="deleteAddress"/>
                <permission roles="user-group" type="consume"/>
                <permission roles="user-group" type="browse"/>
                <permission roles="user-group" type="send"/>
                <permission roles="user-group" type="manage"/>
            </security-setting>
        </security-settings>
    </core>
</configuration>

producer

import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;

import javax.jms.*;

public class ArtemisProducer {

    public static void main(final String[] args) throws Exception {

        String brokerURL = "tcp://localhost:61716";
        ActiveMQConnectionFactory connFactory = new ActiveMQConnectionFactory(brokerURL);
        connFactory.setUser("user");
        connFactory.setPassword("password");
        final Connection conn = connFactory.createConnection();
        conn.start();
        final Session sess = conn.createSession(true, Session.SESSION_TRANSACTED);
        final Destination dest = sess.createQueue("news.europe.politics");
        final MessageProducer prod = sess.createProducer(dest);
        final Message msg = sess.createTextMessage("Sample message");
        
        prod.send(msg);
        sess.commit();
        conn.close();
    }

}

Upvotes: 0

Views: 845

Answers (1)

Justin Bertram
Justin Bertram

Reputation: 35038

You are seeing the expected behavior. This is because the feature you're using is a wildcard address. In short, any messages sent to a matching address will also be routed to the wildcard address (and any queues bound to that address according to their semantics (i.e. anycast or multicast)).

In your case the wildcard address hasn't yet been created when you send your messages so there is no way for those messages to be routed to it.

FWIW, you can see this feature in action in the topic-hierarchies examples which ships with the broker in the examples/features/standard directory.

Upvotes: 1

Related Questions