Apache ActiveMQ Artemis 允許您透過一些簡單的伺服器設定來配置名為轉向器的物件。轉向器允許您透明地將路由到某個位址的訊息轉向到一個或多個其他位址,而無需對任何用戶端應用程式邏輯進行任何更改。

轉向器可以是獨佔式非獨佔式

一個獨佔式轉向器只將訊息路由到新的位址。訊息完全不會路由到舊的位址。

一個非獨佔式轉向器將訊息路由到舊的位址,同時也將訊息的副本傳送到新的位址。您可以將非獨佔式轉向器視為分割訊息流,例如,可能需要監控發送到訂單佇列的每個訂單。

可以為單一位址配置多個轉向器。當一個位址同時配置了獨佔式和非獨佔式轉向器時,會先處理獨佔式的轉向器。如果任何獨佔式轉向器轉向了訊息,則不會處理非獨佔式的轉向器。

轉向器也可以配置為具有可選的訊息篩選器。如果指定了篩選器,則只會轉向符合篩選器的訊息。

轉向器可以將特定的路由類型應用於訊息、移除現有的路由類型,或簡單地傳遞現有的路由類型。這在訊息可能已設定路由類型,但您希望將其轉向到使用不同路由類型的位址時很有用。請務必記住,具有 anycast 路由類型的訊息實際上不會路由到使用 multicast 的佇列,反之亦然。透過配置轉向器的 routing-type,您可以靈活地處理任何情況。有效的值為 ANYCASTMULTICASTPASSSTRIP。預設值為 STRIP

轉向器也可以配置為套用 Transformer。如果指定了 Transformer,則所有轉向的訊息都有機會由 Transformer 轉換。當一個位址配置了多個轉向器時,它們都會收到相同的原始訊息。這表示訊息上轉換器的結果無法直接用於同一個位址上的其他轉向器或其篩選器。請參閱有關新增執行階段相依性的文件,以了解如何使您的轉換器可供 Broker 使用。

轉向器只會將訊息轉向到同一伺服器上的位址。如果您想轉向到不同伺服器上的位址,常見的模式是轉向到本機「儲存並轉發」佇列,然後設定一個橋接器,該橋接器會從該佇列取用訊息並轉發到不同伺服器上的位址。

因此,轉向器是一個非常複雜的概念,當與橋接器結合使用時,可以用來建立有趣且複雜的路由。伺服器上的轉向器集合可以被認為是訊息的路由表類型。將轉向器與橋接器結合使用,可以讓您在多個地理位置分散的伺服器之間建立可靠的路由連線分散式網路,從而建立您的全域訊息傳遞網格。

轉向器在 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>