Apache ActiveMQ Artemis 允许您使用一些简单的服务器配置来配置名为 *转向* 的对象。转向允许您将路由到一个地址的消息透明地转向一个或多个其他地址,而无需对任何客户端应用程序逻辑进行任何更改。

转向可以是 *独占的* 或 *非独占的*。

一个 独占 转向仅将消息路由到新地址。消息不会被路由到旧地址。

一个 非独占 转向将消息路由到旧地址,并且消息的 *副本* 也发送到新地址。将非独占转向视为 *拆分* 消息流,例如,可能需要监视发送到订单队列的每个订单。

可以为单个地址配置多个转向。当一个地址同时配置了独占转向和非独占转向时,将首先处理独占转向。如果任何独占转向转向了消息,则不会处理非独占转向。

还可以配置转向以具有可选的消息过滤器。如果指定了过滤器,则只有与过滤器匹配的消息才会被转向。

转向可以将特定路由类型应用于消息,剥离现有路由类型,或者简单地将现有路由类型传递。这在消息可能已设置其路由类型但您希望将其转向使用不同路由类型的地址的情况下很有用。重要的是要记住,具有 anycast 路由类型的消息实际上不会路由到使用 multicast 的队列,反之亦然。通过配置转向的 routing-type,您可以灵活地处理任何情况。有效值为 ANYCASTMULTICASTPASSSTRIP。默认值为 STRIP

还可以配置转向以应用 Transformer。如果指定,所有转向的消息都有机会被 Transformer 变换。当一个地址配置了多个转向时,所有转向都接收相同的消息。这意味着变换器对消息的结果不会直接可用于同一地址上的其他转向或其过滤器。请参阅关于 添加运行时依赖项 的文档,以了解如何使您的变换器对代理可用。

转向只会将消息转向到 *同一服务器* 上的地址。如果您希望转向到不同服务器上的地址,常见的模式是转向到本地 "存储和转发" 队列,然后设置一个 桥接器,它从该队列消费并转发到不同服务器上的地址。

因此,转向是一个非常复杂的概念,当与桥接器结合使用时,可以用来创建有趣且复杂的路由。服务器上的转向集可以被认为是消息的一种路由表。将转向与桥接器结合使用,您可以创建多个地理分布式服务器之间可靠路由连接的分布式网络,从而创建您的全局消息网格。

转向在 broker.xml 文件中以 xml 格式定义,位于 core 属性级别。文件中可以有零个或多个转向。

转向的消息会获得 特殊属性

请参阅 示例,以获取 ./examples/features/standard/divert/ 中的完整工作示例,向您展示如何配置和使用转向。

让我们来看一些转向示例……​

1. 独占转向

让我们来看一个独占转向。独占转向将所有匹配的路由到旧地址的消息转向到新地址。匹配的消息不会被路由到旧地址。

以下是一些关于独占转向的示例 xml 配置,它来自转向示例

<divert name="prices-divert">
   <address>priceUpdates</address>
   <forwarding-address>priceForwarding</forwarding-address>
   <filter string="office='New York'"/>
   <transformer-class-name>
      org.apache.activemq.artemis.jms.example.AddForwardingTimeTransformer
   </transformer-class-name>
   <exclusive>true</exclusive>
</divert>

我们定义了一个名为 prices-divert 的转向,它将把发送到地址 priceUpdates 的任何消息转向到另一个本地地址 priceForwarding

我们还指定了一个消息过滤器字符串,以便只有消息属性 office 的值为 New York 的消息才会被转向,所有其他消息将继续被路由到正常地址。过滤器字符串是可选的,如果没有指定,则所有消息都将被视为匹配。

在本例中,指定了变换器类,但没有任何配置属性。同样,这也是可选的,如果指定了变换器,它将对每个匹配的消息执行。这允许您在消息被转向之前更改消息体或属性。在本例中,变换器只是添加一个标题,记录转向发生的时间。有关变换器特定配置的更多详细信息,请参阅 变换器章节

本例实际上是将消息转向到本地存储和转发队列,该队列配置了将消息转发到另一台 ActiveMQ Artemis 服务器上的地址的桥接器。有关更多详细信息,请参阅示例。

2. 非独占转向

现在我们将看看一个非独占转向。非独占转向与独占转向相同,但它们只将消息的 *副本* 转发到新地址。原始消息继续到旧地址

因此,您可以将非独占转向视为 *拆分* 消息流。

非独占转向可以像独占转向一样配置,具有可选的过滤器和变换器,以下是一个非独占转向示例,同样来自转向示例

<divert name="order-divert">
   <address>orders</address>
   <forwarding-address>spyTopic</forwarding-address>
   <exclusive>false</exclusive>
</divert>

上面的转向示例会将发送到地址 orders 的每条消息的副本发送到一个名为 spyTopic 的本地地址。

3. 复合转向

复合 转向是指将消息转发到多个地址的转向。这种模式有时被称为 *扇出*。配置很简单。只需在 forwarding-address 中使用逗号分隔的列表,例如

<divert name="shipping-divert">
   <address>shipping</address>
   <forwarding-address>dallas, chicago, denver</forwarding-address>
   <exclusive>false</exclusive>
</divert>