Как указать topi c или очередь при отправке / подписке на объект JMS, ActiveMQ Artemis и STOMP - PullRequest
0 голосов
/ 11 марта 2020

Я использую систему обмена сообщениями ActiveMQ Artemis и тестирую свою настройку с помощью STOMP (stomp.py).

Я создал в Artemis «адрес» с именем Site.SOF.Order.Fulfillment.Submission.ActiveOmni.Topic и прикрепил две очереди к нему:

  • Site.SOF.Order.Fulfillment.Submission.ActiveOmni.queue (многоадресная передача)
  • Site.SOF.Order.Fulfillment.Submission.ActiveOmni.log.queue (многоадресная передача)

Вот экспортированные привязки:

<bindings>
   <address-binding routing-types="ANYCAST" name="DLQ" id="2"/>
   <address-binding routing-types="ANYCAST" name="ExpiryQueue" id="6"/>
   <address-binding routing-types="MULTICAST" name="activemq.notifications" id="10"/>
   <address-binding routing-types="MULTICAST" name="Site.SOF.Order.Fulfillment.Submission.Topic" id="92"/>
   <queue-binding address="Site.SOF.Order.Fulfillment.Submission.Topic" filter-string="" name="Site.SOF.Order.Fulfillment.Submission.log.Queue" id="97" routing-type="MULTICAST"/>
   <queue-binding address="DLQ" filter-string="" name="DLQ" id="4" routing-type="ANYCAST"/>
   <queue-binding address="ExpiryQueue" filter-string="" name="ExpiryQueue" id="8" routing-type="ANYCAST"/>
   <queue-binding address="Site.SOF.Order.Fulfillment.Submission.Topic" filter-string="" name="Site.SOF.Order.Fulfillment.Submission.ActiveOmni.Queue" id="94" routing-type="MULTICAST"/>
</bindings>

Я создал пользователя с доступом к Site.*

Так как мне получить доступ к очередям? Например, если я использую инструмент командной строки stomp.py, например:

> subscribe Site.SOF.Order.Fulfillment.Submission.ActiveOmni.queue

, я получаю сообщение об ошибке:

[username] does not have permission='CREATE_ADDRESS' on address Site.SOF.Order.Fulfillment.Submission.ActiveOmni.queue

Поэтому я пытаюсь добавить /queue/ вперед, как я видел в уроках

> subscribe /queue/Site.SOF.Order.Fulfillment.Submission.ActiveOmni.queue

Но я получаю ту же ошибку:

[username] does not have permission='CREATE_ADDRESS' on address /queue/Site.SOF.Order.Fulfillment.Submission.ActiveOmni.queue

Я могу отправить в тему / адрес без проблем. В результате в обеих очередях появляется сообщение «привет».

send Site.SOF.Order.Fulfillment.Submission.ActiveOmni.Topic "hello"

Это соглашение об именах, которое я пропускаю? Или способ указать topi c vs queue? Что мне здесь не хватает, это слишком очевидно, чтобы быть четко задокументированным?

1 Ответ

1 голос
/ 11 марта 2020

Позвольте мне сначала предоставить некоторую справочную информацию ...

Модель адресов ActiveMQ Artemis включает 3 основных элемента - адреса, очереди и типы маршрутизации. Это низкоуровневые объекты, которые используются для реализации всех различных семантик для всех различных протоколов и конфигураций, которые поддерживает брокер.

STOMP, напротив, просто поддерживает неоднозначные «места назначения». В спецификации STOMP 1.2 говорится об адресатах:

Сервер STOMP моделируется как набор адресатов, на которые можно отправлять сообщения. Протокол STOMP рассматривает места назначения как непрозрачную строку, а их синтаксис определяется спецификацией реализации сервера c. Кроме того, STOMP не определяет, какой должна быть семантика доставки адресатов. Семантика адресатов доставки или обмена сообщениями может варьироваться от сервера к серверу и даже от пункта назначения к пункту назначения. Это позволяет серверам проявлять творческий подход с семантикой, которую они могут поддерживать с помощью STOMP.

В базовой модели адресов сообщения отправляются на адреса и потребляются из очередей. Адреса и очереди именуются независимо, поэтому имена, используемые основным производителем и потребителем, могут различаться.

ActiveMQ Artemis поддерживает семантику как точка-точка, так и семантика публикации / подчинения для пунктов назначения STOMP. Подробнее о том, как настроить эту семантику, можно прочитать в последней документации STOMP ActiveMQ Artemis .

В случае использования STOMP точка-точка сообщение отправляется в пункт назначения и используется из того же пункта назначения. Имя, которое используют и производитель, и потребитель STOMP , совпадают . Для поддержки этой семантики брокер использует адрес ядра и ядро ​​ anycast очередь с тем же именем .

В сценарии использования STOMP pub / sub a клиент создает подписку в пункте назначения, которую он затем может использовать для получения сообщений, отправляемых этому пункту назначения. Имя, которое подписчик и производитель STOMP использует , совпадает . Для поддержки этой семантики брокер использует адрес ядра и ядро ​​ multicast queue с разными именами . Имя основной очереди генерируется посредником автоматически. Затем подписчик может получать сообщения непосредственно из базовой очереди подписки.

Все это делается за кулисами для клиентов STOMP, но важно понимать, как STOMP сопоставляется с адресной моделью ActiveMQ Artemis, чтобы вы могли настройте вещи соответствующим образом


В вашем случае вы настроили адрес с 2 многоадресными очередями и пытаетесь использовать их из этих очередей. Этот сценарий использования представляет собой сочетание двухточечной связи и публикации / подписки, поскольку у вас есть статически определенные очереди (т. Е. Очереди, автоматически не создаваемые брокером в ответ на подписчика), но очереди многоадресные. Эти очереди похожи на статически настроенные долговременные подписки. Чтобы получить прямой доступ к очередям, вам нужно использовать их полное имя очереди (например, FQQN) от вашего клиента. FQQN следует шаблону <address>::<queue>, поэтому в вашем случае вы бы использовали

Site.SOF.Order.Fulfillment.Submission.ActiveOmni.Topic::Site.SOF.Order.Fulfillment.Submission.ActiveOmni.queue

или

Site.SOF.Order.Fulfillment.Submission.ActiveOmni.Topic::Site.SOF.Order.Fulfillment.Submission.ActiveOmni.log.queue
...