Apache Артемида и адресная маршрутизация - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь понять, как Artemis выполняет свою маршрутизацию (я использую Artemis 2.11.0). Я хотел бы настроить два разных адреса STATUS_LOG.V01 и STATUS_LOG.V02. С точки зрения JMS одна представляет собой очередь (V01), а другая - topi c (V02). Topi c должен передавать свои сообщения в ранее определенную очередь. У меня в брокере следующее: xml:

<address name="STATUS_LOG.V01">
   <anycast>
      <queue name="STATUS_LOG.V01" />
   </anycast>
</address>
<address name="STATUS_LOG.V02">
   <multicast>
      <queue name="STATUS_LOG.V01" />
   </multicast>
</address>  

Когда я отправляю сообщение на адрес STATUS_LOG.V01, я вижу его в очереди STATUS_LOG.V01 через веб-интерфейс, как и ожидалось. Когда я публикую sh сообщение по адресу STATUS_LOG.V02, я ожидаю увидеть сообщение в очереди STATUS_LOG.V01, но не могу.

У нас есть существующая очередь, которая получает сообщения о состоянии (STATUS_LOG.V01) от конечных адаптеров. В конечном счете, мы хотели бы добавить другое назначение (STATUS_LOG.V02) (назначение topi c - поведение PUBSUB) для использования в будущих выпусках. Тем не менее, мы хотим, чтобы сообщения, полученные на новом topi c, направлялись в существующую очередь. Это выполнимо в ActiveMQ Artemis?

1 Ответ

2 голосов
/ 24 апреля 2020

То, что вы видите, - это ожидаемое поведение, поскольку ваша конфигурация не разрешена. Имена очередей должны быть уникальными для всего брокера. Вы не можете иметь одну и ту же очередь, привязанную к нескольким адресам. Вы пытаетесь настроить очередь STATUS_LOG.V01 по обоим адресам STATUS_LOG.V01 & STATUS_LOG.V02. Когда вы запускаете брокер, вы должны видеть логирование следующим образом:

INFO  [org.apache.activemq.artemis.core.server] AMQ221080: Deploying address STATUS_LOG.V01 supporting [ANYCAST]
INFO  [org.apache.activemq.artemis.core.server] AMQ221003: Deploying ANYCAST queue STATUS_LOG.V01 on address STATUS_LOG.V01
INFO  [org.apache.activemq.artemis.core.server] AMQ221080: Deploying address STATUS_LOG.V02 supporting [MULTICAST]
INFO  [org.apache.activemq.artemis.core.server] AMQ221003: Deploying MULTICAST queue STATUS_LOG.V01 on address STATUS_LOG.V02
WARN  [org.apache.activemq.artemis.core.server] AMQ229019: Queue STATUS_LOG.V01 already exists on address STATUS_LOG.V01

Обратите внимание на последний WARN зарегистрирован. Это означает, что очередь STATUS_LOG.V01 нельзя привязать к адресу STATUS_LOG.V02, поскольку она уже привязана к адресу STATUS_LOG.V01.

. Что вам действительно нужно сделать, это создать divert принимать сообщения, отправленные на ваш STATUS_LOG.V02 адрес, и пересылать их на ваш STATUS_LOG.V01 адрес. Используйте это вместо вашей первоначальной конфигурации:

<address name="STATUS_LOG.V01">
   <anycast>
      <queue name="STATUS_LOG.V01" />
   </anycast>
</address>
<address name="STATUS_LOG.V02">
   <multicast/>
</address> 
<divert name="myDivert">
   <address>STATUS_LOG.V02</address>
   <forwarding-address>STATUS_LOG.V01</forwarding-address>
   <exclusive>true</exclusive>
</divert>

Мне не ясно, хотите ли вы установить exclusive в true для вашего варианта использования или нет. Если exclusive равно true, то ни один из подписчиков JMS topi c на STATUS_LOG.V02 не получит сообщения, отправленные на STATUS_LOG.V02. Все сообщения, отправленные на STATUS_LOG.V02, будут перенаправляться исключительно на STATUS_LOG.V01. Если exclusive равно false, то подписчики JMS topi c на STATUS_LOG.V02 получат сообщения, отправленные на STATUS_LOG.V02, и сообщения также будут перенаправлены на STATUS_LOG.V01. Подробнее о дивертерах можно прочитать в документации .

...