【问题标题】:Apache Artemis and address routingApache Artemis 和地址路由
【发布时间】:2020-08-08 08:55:09
【问题描述】:

我正在尝试了解 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 地址发送消息时,我可以通过 Web UI 在STATUS_LOG.V01 队列中看到它,如预期的那样。当我向STATUS_LOG.V02 地址发布消息时,我希望在STATUS_LOG.V01 队列中看到该消息,但我没有。

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

【问题讨论】:

  • 通过网络用户界面
  • 我正在尝试将一个地址汇集到另一个地址(因此静态指定名称)。
  • 谢谢贾斯汀。这说明了这一点。我们有一个从端点适配器接收状态消息 (STATUS_LOG.V01) 的现有队列。我们想添加另一个目的地 (STATUS_LOG.V02)(主题目的地 - PUBSUB 行为)以用于未来的版本。但是,我们希望将在新主题上收到的消息路由到现有队列。这在 Artemis 中可行吗?
  • 我用这个重要的用例描述更新了你的问题,我也更新了我的答案。
  • 感谢贾斯汀的澄清和解决方案。我很感激。

标签: activemq-artemis


【解决方案1】:

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

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 主题订阅者都不会收到发送到STATUS_LOG.V02 的消息。发送到STATUS_LOG.V02 的所有消息将专门转移到STATUS_LOG.V01。如果exclusivefalse,那么STATUS_LOG.V02 上的JMS 主题订阅者将收到发送到STATUS_LOG.V02 的消息,并且这些消息会被转移到STATUS_LOG.V01。你可以在the documentation阅读更多关于转移的信息。

【讨论】:

    猜你喜欢
    • 2019-01-11
    • 2020-07-09
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 2020-04-24
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多