Apache ActiveMQ Artemis 包含一個功能完整的 JMS 訊息橋接器。

橋接器的功能是從來源佇列或主題取用訊息,並將它們傳送到目標佇列或主題,通常是在不同的伺服器上。

JMS 橋接器並非要取代轉換和更專業的系統(如 Camel)。JMS 橋接器可能適用於本章所述的快速傳輸,但請記住,需要轉換的更複雜情境會需要您使用更進階的轉換系統,該系統會針對超出 Apache ActiveMQ Artemis 的使用案例發揮作用。

來源和目標伺服器不必在同一個叢集中,這使得橋接適合於可靠地將訊息從一個叢集傳送到另一個叢集,例如跨 WAN,而且連線可能不可靠。

橋接器可以部署為獨立應用程式,或是由使用 Apache ActiveMQ Artemis 啟動的內嵌 Jetty 執行個體管理的 Web 應用程式。來源和目標可以位於同一個虛擬機器或另一個虛擬機器中。

只要符合 JMS 1.1 標準,橋接器也可以用來橋接來自其他非 Apache ActiveMQ Artemis JMS 伺服器的訊息。

請勿將 JMS 橋接器與核心橋接器混淆。JMS 橋接器可以用來橋接任何兩個符合 JMS 1.1 標準的 JMS 提供者,並使用 JMS API。核心橋接器) 用來橋接任何兩個 Apache ActiveMQ Artemis 執行個體,並使用核心 API。如果可以,請務必優先使用核心橋接器而非 JMS 橋接器。核心橋接器通常會提供比 JMS 橋接器更好的效能。此外,核心橋接器可以提供一次且僅一次的傳遞保證,而無需使用 XA。

橋接器內建有容錯能力,因此如果來源或目標伺服器連線遺失 (例如因網路故障造成),橋接器會重試連線到來源和/或目標,直到它們重新連線。當它重新連線時,會恢復正常運作。

可以使用選用的 JMS 選取器來設定橋接器,因此它只會取用符合該 JMS 選取器的訊息

可以設定為從佇列或主題取用。當它從主題取用時,可以設定為使用非持久或持久訂閱來取用

JMS 橋接器是一個簡單的 POJO,因此可以使用大多數架構部署,只需實例化 org.apache.activemq.artemis.api.jms.bridge.impl.JMSBridgeImpl 類別並設定適當的參數。

1. JMS 橋接器參數

主要的 POJO 是 JMSBridge。它可以透過傳遞給其建構函式的參數來設定。

  • 來源連線工廠工廠

    這會注入 SourceCFF bean (也在 beans 檔案中定義)。此 bean 用於建立來源 ConnectionFactory

  • 目標連線工廠工廠

    這會注入 TargetCFF bean (也在 beans 檔案中定義)。此 bean 用於建立目標 ConnectionFactory

  • 來源目的地工廠工廠

    這會注入 SourceDestinationFactory bean (也在 beans 檔案中定義)。此 bean 用於建立來源 Destination

  • 目標目的地工廠工廠

    這會注入 TargetDestinationFactory bean (也在 beans 檔案中定義)。此 bean 用於建立目標 Destination

  • 來源使用者名稱

    此參數是用於建立來源連線的使用者名稱

  • 來源密碼

    此參數是用於建立來源連線的參數

  • 目標使用者名稱

    此參數是用於建立目標連線的使用者名稱

  • 目標密碼

    此參數是用於建立目標連線的密碼

  • 選取器

    這表示用於從來源目的地取用訊息的 JMS 選取器運算式。只有符合選取器運算式的訊息才會從來源橋接到目標目的地

    選取器運算式必須遵循 JMS 選取器語法

  • 失敗重試間隔

    這表示在橋接器偵測到失敗時,嘗試重新建立與來源或目標伺服器的連線之間要等待的時間量 (毫秒)

  • 最大重試次數

    這表示在橋接器偵測到失敗時,嘗試重新建立與來源或目標伺服器的連線的次數。橋接器在嘗試此次數後會放棄。-1 表示「永遠嘗試」

  • 服務品質

    此參數表示所需的服務品質模式

    可能的值為

    • AT_MOST_ONCE

    • DUPLICATES_OK

    • ONCE_AND_ONLY_ONCE

    請參閱服務品質章節,以了解這些模式的說明。

  • 最大批次大小

    這表示在將訊息以批次傳送到目標目的地之前,要從來源目的地取用的最大訊息數。其值必須 >= 1

  • 最大批次時間

    這表示在將批次傳送到目標之前要等待的最大毫秒數,即使取用的訊息數尚未達到 MaxBatchSize。其值必須為 -1 表示「永遠等待」,或 >= 1 表示指定實際時間

  • 訂閱名稱

    如果來源目的地代表主題,而且您想要使用持久訂閱從主題取用,則此參數代表持久訂閱名稱

  • 用戶端 ID

    如果來源目的地代表主題,而且您想要使用持久訂閱從主題取用,則此屬性代表在建立/查閱持久訂閱時要使用的 JMS 用戶端 ID

  • 在標頭中新增 MessageID

    如果為 true,則原始訊息的訊息 ID 會附加在傳送到目的地的訊息的標頭 ACTIVEMQ_BRIDGE_MSG_ID_LIST 中。如果訊息橋接多次,則會附加每個訊息 ID。這允許使用分散式請求-回應模式

    當您收到訊息時,可以使用第一個訊息 ID 的相關 ID 來傳回回應,以便原始傳送者取回時可以將其關聯起來。

  • MBean 伺服器

    若要使用 JMX 管理 JMS 橋接器,請設定必須註冊 JMS 橋接器 MBean 的 MBeanServer (例如 JVM Platform MBeanServer)

  • ObjectName

    如果您設定 MBeanServer,您還需要設定用來註冊 JMS 橋接器 MBean 的 ObjectName (必須是唯一的)

「transactionManager」屬性指向 JTA 交易管理員實作,如果您需要使用「ONCE_AND_ONCE_ONLY」服務品質,則應該設定此屬性。Apache ActiveMQ Artemis 不附帶此類實作,但如果您在應用程式伺服器中執行,您可以注入隨附的交易管理員。

2. 來源和目標連線工廠

來源和目標連線工廠工廠用於建立連線工廠,該連線工廠用於建立來源或目標伺服器的連線。

上述設定範例使用 Apache ActiveMQ Artemis 提供的預設實作,該實作使用 JNDI 查閱連線工廠。對於其他應用程式伺服器或 JMS 提供者,可能必須提供新的實作。這可以透過實作 org.apache.activemq.artemis.jms.bridge.ConnectionFactoryFactory 介面輕鬆完成。

3. 來源和目標目的地工廠

同樣地,這些用於建立或查閱目的地。

在上述設定範例中,我們使用了 Apache ActiveMQ Artemis 提供的預設值,該預設值使用 JNDI 查閱目的地。

可以透過實作 org.apache.activemq.artemis.jms.bridge.DestinationFactory 介面來提供新的實作。

4. 服務品質

這裡更詳細地說明了橋接器使用的服務品質模式。

4.1. AT_MOST_ONCE

使用此 QoS 模式,訊息將至多一次從來源到達目的地。訊息會從來源取用,並在傳送到目的地之前確認。因此,如果將它們從來源移除和到達目的地之間發生失敗,則可能會遺失它們。因此,傳遞最多會發生一次。

此模式適用於持久和非持久訊息。

4.2. DUPLICATES_OK

使用此 QoS 模式,會從來源取用訊息,然後在它們成功傳送到目的地之後再確認。因此,如果傳送到目的地之後但在確認之前發生失敗,則在系統復原時可能會再次傳送它們。亦即,目的地在發生失敗後可能會收到重複訊息。

此模式適用於持久和非持久訊息。

4.3. ONCE_AND_ONLY_ONCE

此 QoS 模式確保訊息將一次且僅一次從來源到達目的地。(有時此模式稱為「精確一次」)。如果來源和目的地都在同一個 Apache ActiveMQ Artemis 伺服器執行個體上,則可以透過在同一個本機交易中傳送和確認訊息來達成。如果來源和目的地在不同的伺服器上,則可以透過在 JTA 交易中登記傳送和取用工作階段來達成。JTA 交易由 JTA 交易管理員控制,該管理員需要透過橋接器上的 settransactionManager 方法設定。

此模式僅適用於持久訊息。

對於特定的應用程式,可能可以在不使用 ONCE_AND_ONLY_ONCE QoS 層級的情況下提供一次且僅一次的語意。這可以透過使用 DUPLICATES_OK 模式,然後在目的地檢查重複訊息並捨棄它們來完成。某些 JMS 伺服器提供自動重複訊息偵測功能,或者可以在應用程式層級透過維護磁碟上已接收訊息 ID 的快取並將已接收訊息與它們進行比較來實作此功能。快取僅在特定時間內有效,因此此方法不像使用 ONCE_AND_ONLY_ONCE 那樣嚴密,但根據您的特定應用程式,它可能是一個不錯的選擇。

4.4. 超時和 JMS 橋接器

目標或來源伺服器在某些時間點可能無法使用。如果發生這種情況,橋接器會嘗試 Max Retries 次重新連線,每次嘗試間隔 Failure Retry Interval 毫秒,此設定在 JMS 橋接器的定義中指定。

如果您實作自己的工廠來查找 JMS 資源,則必須考慮逾時問題。

4.5. 範例

請參閱JMS 橋接器範例,其中展示如何以程式化的方式實例化和配置 JMS 橋接器,以便在兩個獨立的 Apache ActiveMQ Artemis 代理程式之間將訊息傳送到來源目的地並從目標目的地接收訊息。