Apache Artemis 和地址路由
Apache Artemis and address routing
我想了解 Artemis 如何进行路由(我使用的是 Artemis 2.11.0)。我想配置两个不同的地址 STATUS_LOG.V01
和 STATUS_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.V01
和 STATUS_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
。如果 exclusive
是 true
,则 STATUS_LOG.V02
上的 JMS 主题订阅者中的 none 将收到发送到 STATUS_LOG.V02
的消息。发送到 STATUS_LOG.V02
的所有消息将专门转移到 STATUS_LOG.V01
。如果 exclusive
是 false
,则 STATUS_LOG.V02
上的 JMS 主题订阅者将收到发送到 STATUS_LOG.V02
的消息,并且消息将 也 转移至 STATUS_LOG.V01
。您可以在 the documentation.
中阅读更多关于转移的信息
我想了解 Artemis 如何进行路由(我使用的是 Artemis 2.11.0)。我想配置两个不同的地址 STATUS_LOG.V01
和 STATUS_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.V01
和 STATUS_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
。如果 exclusive
是 true
,则 STATUS_LOG.V02
上的 JMS 主题订阅者中的 none 将收到发送到 STATUS_LOG.V02
的消息。发送到 STATUS_LOG.V02
的所有消息将专门转移到 STATUS_LOG.V01
。如果 exclusive
是 false
,则 STATUS_LOG.V02
上的 JMS 主题订阅者将收到发送到 STATUS_LOG.V02
的消息,并且消息将 也 转移至 STATUS_LOG.V01
。您可以在 the documentation.