如何查找多播队列?

时间:2019-03-26 06:17:16

标签: activemq-artemis

broker.xml中配置以下主题/队列:

<address name="Topic1">
   <multicast>
      <queue name="Queue1"/>
      <queue name="Queue2"/>
   </multicast>
</address>

如何为发送消息的Queue1 / Queue2创建生产者?我正在使用ActiveMQ Artemis 2.6.3。

使用以下方式创建连接工厂,连接和队列查找

Hashtable<String, Object> properties = new Hashtable<>();
properties.put("connectionFactory.ConnectionFactory", (tcp://localhost:61618,tcp://localhost:61616)?ha=true&retryInterval=3000&reconnectAttempts=-1&initialConnectAttempts=10&maxRetryInterval=3000&clientFailureCheckPeriod=1000);
properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory");
InitialContext jndiContext = new InitialContext(properties);
ConnectionFactory connFactory = (ConnectionFactory) jndiContext.lookup(connectionFactory);
Connection connection = connFactory.createConnection(userName, password);
Session session = connection.createSession(true,javax.jms.Session.AUTO_ACKNOWLEDGE);
//Using following way looking up Multicast Queue2 on Address Topic1
Destination dest = new ActiveMQTopic("Topic1::Queue2");
MessageProducer producer = session.createProducer(dest);
producer.send(message, Message.DEFAULT_DELIVERY_MODE, Message.DEFAULT_PRIORITY, msgTTL);

在完成上面的代码更改并尝试发送消息之后,消息将不会发送到队列“ Queue2”

2 个答案:

答案 0 :(得分:0)

通常,您想选择一种适合您需要的路由类型。选择是:

  • anycast:提供点对点语义(例如JMS队列);发送到该地址的邮件仅路由到一个任意播队列
  • 多播:提供发布-订阅语义(例如JMS主题);发送到该地址的邮件将被路由到所有多播队列

您有一个名为Topic的地址,该地址带有2个多播队列-Queue1Queue2。因此,发送到Topic的消息将同时到达Queue1Queue2。如果您只想将消息发送到一个队列,则可以考虑使用其他配置(例如,具有任播队列的地址)。

但是,如果出于任何原因发现确实需要现有配置,则可以使用完全限定的队列名称(即FQQN)通过语法

:: 发送消息。我发现您已经在尝试这样做,例如:

Destination dest = new ActiveMQTopic("Topic1::Queue2");

但是,您使用的ActiveMQ Artemis版本不支持FQQN。您需要升级到the latest release which is 2.7.0才能使用此功能。

答案 1 :(得分:0)

与spring和artemis 2.7.0的@justin相同的解决方案:

    JmsTemplate jmsTemplate = new JmsTemplate(new 
    ActiveMQConnectionFactory("tcp://localhost:61616"));
    //this is the important part
    jmsTemplate.setPubSubDomain(true);
    jmsTemplate.convertAndSend("Topic1::Queue2", "hello");