我使用的是ActiveMQ Artemis 2.17.0。我希望创建一个具有通配符语法的使用者,它将使用来自多个地址的消息。我给下一个消费者写信了。但是它使用的是地址news.europe.#,而不是匹配通配符语法的地址(news.europe.sport、news.europe.politics等)。我做错了什么?
设想情况:
news.europe.politics
news.europe.sport,中发送2条消息
预期行为:
接收的消息
观察行为
news.europe.#有活动的使用者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>生产者
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();
}
}发布于 2021-08-02 14:36:07
你看到的是预期的行为。这是因为您使用的特性是一个wildcard 。简而言之,发送到匹配地址的任何消息也将被路由到通配符地址(以及根据它们的语义绑定到该地址的任何队列(即任意广播或多播))。
在您的示例中,在发送消息时尚未创建通配符地址,因此无法将这些消息路由到该地址。
FWIW,您可以在topic-hierarchies示例中看到此特性,这些示例与代理一起附带在examples/features/standard目录中。
https://stackoverflow.com/questions/68613529
复制相似问题