Claim Check

在前面的章節中,我們介紹了幾種內容豐富器元件,可以幫助您處理訊息缺失資料的情況。我們還討論了內容過濾,它允許您從訊息中移除資料項。然而,有時我們希望臨時隱藏資料。例如,在分散式系統中,我們可能會收到一個帶有非常大 payload 的訊息。一些間歇性的訊息處理步驟可能不需要訪問這個 payload,而有些可能只需要訪問某些訊息頭,因此在每個處理步驟中攜帶大型訊息 payload 可能會導致效能下降、產生安全風險,並使除錯更加困難。

The Store in library(或稱為 Claim Check)模式描述了一種機制,允許您將資料儲存在已知位置,同時僅保留指向該資料位置的指標(即 Claim Check)。您可以將該指標作為新訊息的 payload 傳遞,從而使訊息流中的任何元件在需要時立即獲取實際資料。這種方法與掛號信流程非常相似,您在郵箱中收到一個取件憑證,然後必須去郵局領取實際包裹。它也類似於航班或酒店行李提取的概念。

Spring Integration 提供了兩種型別的 Claim Check 轉換器

  • 入站 Claim Check 轉換器

  • 出站 Claim Check 轉換器

可以使用方便的基於名稱空間的機制來配置它們。

入站 Claim Check 轉換器

入站 Claim Check 轉換器透過將其儲存在由其 message-store 屬性標識的訊息儲存中來轉換入站訊息。以下示例定義了一個入站 Claim Check 轉換器

<int:claim-check-in id="checkin"
        input-channel="checkinChannel"
        message-store="testMessageStore"
        output-channel="output"/>

在上述配置中,在 input-channel 上接收到的訊息被持久化到由 message-store 屬性標識的訊息儲存中,並使用生成的 ID 進行索引。該 ID 就是該訊息的 Claim Check。該 Claim Check 也成為傳送到 output-channel 的新(轉換後的)訊息的 payload。

現在,假設在某個時刻您確實需要訪問實際訊息。您可以手動訪問訊息儲存並獲取訊息內容,或者您可以使用相同的方法(建立轉換器),只是現在您透過使用出站 Claim Check 轉換器將 Claim Check 轉換回實際訊息。

以下列表概述了入站 Claim Check 轉換器的所有可用引數

<int:claim-check-in auto-startup="true"             (1)
                    id=""                           (2)
                    input-channel=""                (3)
                    message-store="messageStore"    (4)
                    order=""                        (5)
                    output-channel=""               (6)
                    send-timeout="">                (7)
    <int:poller></int:poller>                       (8)
</int:claim-check-in>
1 生命週期屬性,指示此元件是否應在應用程式上下文啟動期間啟動。預設為 true。此屬性在 Chain 元素內部不可用。可選。
2 標識底層 bean 定義 (MessageTransformingHandler) 的 ID。此屬性在 Chain 元素內部不可用。可選。
3 此端點的接收訊息通道。此屬性在 Chain 元素內部不可用。可選。
4 此 Claim Check 轉換器使用的 MessageStore 引用。如果未指定,預設引用名為 messageStore 的 bean。可選。
5 指定此端點作為通道的訂閱者連線時的呼叫順序。當該通道使用 failover 排程策略時,這尤其重要。當此端點本身是帶有佇列的通道的輪詢消費者時,此屬性無效。此屬性在 Chain 元素內部不可用。可選。
6 標識此端點處理訊息後傳送訊息的訊息通道。此屬性在 Chain 元素內部不可用。可選。
7 指定將回復訊息傳送到輸出通道時等待的最長時間(毫秒)。預設為 30 秒。此屬性在 Chain 元素內部不可用。可選。
8 定義一個輪詢器。此元素在 Chain 元素內部不可用。可選。

出站 Claim Check 轉換器

出站 Claim Check 轉換器允許您將帶有 Claim Check payload 的訊息轉換為以原始內容作為其 payload 的訊息。

<int:claim-check-out id="checkout"
        input-channel="checkoutChannel"
        message-store="testMessageStore"
        output-channel="output"/>

在上述配置中,在 input-channel 上收到的訊息應以 Claim Check 作為其 payload。出站 Claim Check 轉換器透過查詢訊息儲存以獲取由提供的 Claim Check 標識的訊息,將其轉換為帶有原始 payload 的訊息。然後,它將新取出的訊息傳送到 output-channel

以下列表概述了出站 Claim Check 轉換器的所有可用引數

<int:claim-check-out auto-startup="true"             (1)
                     id=""                           (2)
                     input-channel=""                (3)
                     message-store="messageStore"    (4)
                     order=""                        (5)
                     output-channel=""               (6)
                     remove-message="false"          (7)
                     send-timeout="">                (8)
    <int:poller></int:poller>                        (9)
</int:claim-check-out>
1 生命週期屬性,指示此元件是否應在應用程式上下文啟動期間啟動。預設為 true。此屬性在 Chain 元素內部不可用。可選。
2 標識底層 bean 定義 (MessageTransformingHandler) 的 ID。此屬性在 Chain 元素內部不可用。可選。
3 此端點的接收訊息通道。此屬性在 Chain 元素內部不可用。可選。
4 此 Claim Check 轉換器使用的 MessageStore 引用。如果未指定,預設引用名為 messageStore 的 bean。可選。
5 指定此端點作為通道的訂閱者連線時的呼叫順序。當該通道使用 failover 排程策略時,這尤其重要。當此端點本身是帶有佇列的通道的輪詢消費者時,此屬性無效。此屬性在 Chain 元素內部不可用。可選。
6 標識此端點處理訊息後傳送訊息的訊息通道。此屬性在 Chain 元素內部不可用。可選。
7 如果設定為 true,此轉換器將從 MessageStore 中移除訊息。當訊息只能被“Claim”一次時,此設定很有用。預設為 false。可選。
8 指定將回復訊息傳送到輸出通道時等待的最長時間(毫秒)。預設為 30 秒。此屬性在 Chain 元素內部不可用。可選。
9 定義一個輪詢器。此元素在 Chain 元素內部不可用。可選。

Claim Once

有時,特定訊息只能被 Claim 一次。作為一個類比,考慮處理飛機行李的過程。您在出發時托執行李並在抵達時提取行李。一旦行李被提取,如果未重新辦理託運手續,就不能再次提取。為了適應這種情況,我們在 claim-check-out 轉換器上引入了一個布林屬性 remove-message。此屬性預設為 false。但是,如果設定為 true,Claim 的訊息將從 MessageStore 中移除,以便不能再次 Claim。

此功能對儲存空間有影響,特別是在基於記憶體 MapSimpleMessageStore 的情況下,未能移除訊息最終可能導致 OutOfMemoryException。因此,如果您不期望進行多次 Claim,我們建議您將 remove-message 屬性的值設定為 true。以下示例展示瞭如何使用 remove-message 屬性

<int:claim-check-out id="checkout"
        input-channel="checkoutChannel"
        message-store="testMessageStore"
        output-channel="output"
        remove-message="true"/>

關於訊息儲存的說明

雖然我們很少關心 Claim Checks 的細節(只要它們工作即可),但您應該知道,Spring Integration 中實際 Claim Check(指標)的當前實現使用 UUID 來確保唯一性。

org.springframework.integration.store.MessageStore 是用於儲存和檢索訊息的策略介面。Spring Integration 提供了兩種方便的實現

  • SimpleMessageStore:一個基於記憶體 Map 的實現(預設,適用於測試)

  • JdbcMessageStore:一個使用 JDBC 透過關係型資料庫的實現