当前位置: 首页 > 知识库问答 >
问题:

具有通配符语法的使用者

司寇山
2023-03-14

我正在使用ActiveMQ Artemis 2.17.0。我想创建一个具有通配符语法的消费者,它将使用来自多个地址的消息。我写了《下一个消费者》。但它消耗的是地址新闻。欧洲# ,但不是来自匹配通配符语法的地址(news.europe.sportnews.europe.politics等)。我做错了什么?

情景:

  1. 启动Artemis broker
  2. 新闻中与制作人发送两条消息。欧洲体育新闻。欧洲政治
  3. 启动消费者

预期行为:

  • 2消费者收到的信息

观察到的行为

  • 邮件仍在队列中
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();
    }
}

经纪人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>

制片人

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();
    }

}


共有1个答案

海翼
2023-03-14

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

在您的情况下,在发送邮件时尚未创建通配符地址,因此无法将这些邮件路由到通配符地址。

FWIW,您可以在主题层次结构示例中看到此功能的作用,该示例与代理一起发布在示例/功能/标准目录中。

 类似资料:
  • 问题内容: 在node.js中,我可以列出具有通配符匹配的文件吗? 在fs文档中找不到通配符匹配的信息。 问题答案: Node核心未涵盖此范围。您可以检查该模块的内容。npmjs.org还是查找各种模块的绝佳资源。 用法

  • 问题内容: 我要执行以下mysql查询: 我尝试了一下但没有成功: 因此,我问您是否可以在准备好的语句中使用%通配符。 /编辑 谢谢。其与: 问题答案: 它也可以通过以下方式与绑定参数一起使用:

  • 问题内容: 我正在对Spring Data使用Elastic Search。 我在存储库中有一个简单的方法: 由于SPACE,此方法未给出预期结果。 错误获取: “无法构造查询’ “ a b” ‘。请使用表达式或多个子句。EXCEPTION =“ org.springframework.dao.InvalidDataAccessApiUsageException:无法构造查询’ ” a b“ ‘,

  • 问题内容: 我想拥有一个Class对象,但是我想强迫它代表的任何类扩展A类并实现接口B。 我可以: 要么: 但我不能两者都做。有没有办法做到这一点? 问题答案: 实际上,你可以做你想做的事。如果要提供多个接口或一个类加接口,则必须使通配符看起来像这样: 请参见sun.com上的泛型教程,特别是页面底部的“ 绑定类型参数”部分。实际上,如果需要,你可以列出多个接口,并& InterfaceName根

  • 我正在阅读OracleDocGenericmethod中的泛型方法。当它说什么时候使用通配符和什么时候使用泛型方法时,我对比较感到很困惑。引用文档。 我们本可以在这里使用通用方法: [...]这告诉我们类型参数正被用于多态;它的唯一作用是允许在不同的调用站点使用各种实际的参数类型。如果是这样的话,应该使用通配符。通配符旨在支持灵活的子类型,这就是我们在这里试图表达的。 我们不觉得像《代码》(Col

  • 本文向大家介绍c语言实现的带通配符匹配算法,包括了c语言实现的带通配符匹配算法的使用技巧和注意事项,需要的朋友参考一下 原创代码。 ‘?'代表任意单个字符,‘*'代表任意0个或多个字符。常用于文件的搜素匹配。 以上所述就是本文的全部内容了,希望大家能够喜欢。