Apache Artemis 和地址路由

Apache Artemis and address routing

我想了解 Artemis 如何进行路由(我使用的是 Artemis 2.11.0)。我想配置两个不同的地址 STATUS_LOG.V01STATUS_LOG.V02。从 JMS 的角度来看,一个是队列 (V01),一个是主题 (V02)。该主题应将其消息多播到先前定义的队列。我在 broker.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 网络 UI 队列中看到它。当我向 STATUS_LOG.V02 地址发布消息时,我希望在 STATUS_LOG.V01 队列中看到该消息,但我没有看到。

我们有一个现有队列,它从端点适配器接收状态消息 (STATUS_LOG.V01)。最终,我们想添加另一个目的地 (STATUS_LOG.V02)(主题目的地 - PUBSUB 行为)以用于未来的发布。但是,我们希望将在新主题上收到的消息路由到现有队列。这在 ActiveMQ Artemis 中可行吗?

您看到的是预期行为,因为您的配置不被允许。队列名称在代理中必须是唯一的。您不能将同一个队列绑定到多个地址。您正在尝试在两个地址 STATUS_LOG.V01STATUS_LOG.V02 上配置队列 STATUS_LOG.V01。当您启动代理时,您应该看到这样的日志记录:

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。如果 exclusivetrue,则 STATUS_LOG.V02 上的 JMS 主题订阅者中的 none 将收到发送到 STATUS_LOG.V02 的消息。发送到 STATUS_LOG.V02 的所有消息将专门转移到 STATUS_LOG.V01。如果 exclusivefalse,则 STATUS_LOG.V02 上的 JMS 主题订阅者将收到发送到 STATUS_LOG.V02 的消息,并且消息将 转移至 STATUS_LOG.V01。您可以在 the documentation.

中阅读更多关于转移的信息