Как мне искать многоадресную очередь? - PullRequest
0 голосов
/ 26 марта 2019

Настроил следующую тему / очередь в 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"

1 Ответ

0 голосов
/ 28 марта 2019

В общем, вы хотите выбрать правильный тип маршрутизации для ваших нужд.Возможны следующие варианты:

  • anycast: обеспечивает семантику точка-точка (например, очередь JMS);сообщения, отправленные на адрес, направляются только в одну очередь anycast
  • multicast: обеспечивает семантику публикации-подписки (например, тему JMS);сообщения, отправленные на адрес, направляются в все многоадресные очереди

У вас есть адрес с именем Topic с двумя многоадресными очередями - Queue1 & Queue2.Поэтому сообщения, отправленные на Topic, будут отправляться на оба номера Queue1 & Queue2.Если вы хотите отправлять сообщения только в одну очередь, вы можете использовать другую конфигурацию (например, адрес с произвольной очередью).

Однако, если вы обнаружите, что вам действительно нужна существующая конфигурация по какой-либо причине, вы можете отправить сообщение, используя полное имя очереди (например, FQQN) через синтаксис

:: .Я вижу, что вы уже пытаетесь это сделать, например: Destination dest = new ActiveMQTopic("Topic1::Queue2");

Однако используемая вами версия ActiveMQ Artemis не поддерживает FQQN для производителей.Вам нужно будет обновить до до последней версии 2.7.0 , чтобы использовать эту функцию.

...