首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有通配符语法的使用者

具有通配符语法的使用者
EN

Stack Overflow用户
提问于 2021-08-01 19:04:52
回答 1查看 239关注 0票数 0

我使用的是ActiveMQ Artemis 2.17.0。我希望创建一个具有通配符语法的使用者,它将使用来自多个地址的消息。我给下一个消费者写信了。但是它使用的是地址news.europe.#,而不是匹配通配符语法的地址(news.europe.sportnews.europe.politics等)。我做错了什么?

设想情况:

news.europe.politics

  • Start
  1. Start Artemis broker
  2. 与生产者在news.europe.sport

中发送2条消息

预期行为:

  • 2由消费者

接收的消息

观察行为

  • 消息保持在队列中
  • 地址news.europe.#有活动的使用者

代码语言:javascript
复制
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

代码语言:javascript
复制
<?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>

生产者

代码语言:javascript
复制
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();
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-02 14:36:07

你看到的是预期的行为。这是因为您使用的特性是一个wildcard 。简而言之,发送到匹配地址的任何消息也将被路由到通配符地址(以及根据它们的语义绑定到该地址的任何队列(即任意广播或多播))。

在您的示例中,在发送消息时尚未创建通配符地址,因此无法将这些消息路由到该地址。

FWIW,您可以在topic-hierarchies示例中看到此特性,这些示例与代理一起附带在examples/features/standard目录中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68613529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档