Claim Check

在先前的章節中,我們介紹了幾個內容豐富器元件,它們可以協助您處理訊息遺失部分資料的情況。我們也討論了內容篩選,可讓您從訊息中移除資料項目。然而,有時我們希望暫時隱藏資料。例如,在分散式系統中,我們可能會收到具有非常大酬載的訊息。某些間歇性的訊息處理步驟可能不需要存取此酬載,有些可能只需要存取某些標頭,因此在每個處理步驟中傳輸大型訊息酬載可能會導致效能降低、產生安全性風險,並可能使偵錯更加困難。

儲存在程式庫(或 Claim Check)模式描述了一種機制,可讓您將資料儲存在眾所周知的位置,同時僅維護指向資料位置的指標(Claim Check)。您可以將該指標作為新訊息的酬載傳遞,從而讓訊息流程中的任何元件在需要時立即取得實際資料。這種方法與掛號郵件流程非常相似,您在郵箱中收到 Claim Check,然後必須前往郵局領取您的實際包裹。這也與飛行或飯店後的行李認領概念相同。

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 的新(轉換後的)訊息的酬載。

現在,假設在某些時候您確實需要存取實際訊息。您可以手動存取訊息儲存區並取得訊息的內容,或者您可以使用相同的方法(建立轉換器),只是現在您可以使用傳出 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 ID,用於識別底層 bean 定義 (MessageTransformingHandler)。此屬性在 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 酬載的訊息轉換為具有原始內容作為其酬載的訊息。

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

在先前的配置中,在 input-channel 上接收到的訊息應具有 Claim Check 作為其酬載。傳出 Claim Check 轉換器透過查詢訊息儲存區中由提供的 Claim Check 識別的訊息,將其轉換為具有原始酬載的訊息。然後,它將新簽出的訊息傳送到 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 ID,用於識別底層 bean 定義 (MessageTransformingHandler)。此屬性在 Chain 元素內不可用。選用。
3 此端點的接收訊息通道。此屬性在 Chain 元素內不可用。選用。
4 對此 Claim Check 轉換器要使用的 MessageStore 的參考。如果未指定,則預設參考是指名為 messageStore 的 bean。選用。
5 指定當此端點作為訂閱者連接到通道時的調用順序。當該通道使用 failover 調度策略時,這尤其相關。當此端點本身是具有佇列的通道的輪詢消費者時,它沒有任何效果。此屬性在 Chain 元素內不可用。選用。
6 識別訊息通道,訊息在由此端點處理後會傳送到該訊息通道。此屬性在 Chain 元素內不可用。選用。
7 如果設定為 true,則此轉換器會從 MessageStore 中移除訊息。當訊息只能「認領」一次時,此設定很有用。預設值為 false。選用。
8 指定在將回覆訊息傳送到輸出通道時要等待的最長時間(以毫秒為單位)。預設值為 30 秒。此屬性在 Chain 元素內不可用。選用。
9 定義輪詢器。此元素在 Chain 元素內不可用。選用。

僅認領一次

有時,特定訊息必須僅認領一次。作為類比,請考慮處理飛機行李的過程。您在出發時辦理行李托運,並在抵達時認領行李。一旦行李被認領,就不能再次認領,除非先將其重新托運。為了適應這種情況,我們在 claim-check-out 轉換器上引入了 remove-message 布林屬性。此屬性的預設值設定為 false。但是,如果設定為 true,則認領的訊息會從 MessageStore 中移除,使其無法再次認領。

就儲存空間而言,此功能具有影響,尤其是在基於記憶體內 MapSimpleMessageStore 的情況下,未能移除訊息最終可能會導致 OutOfMemoryException。因此,如果您不期望進行多次認領,我們建議您將 remove-message 屬性的值設定為 true。以下範例顯示如何使用 remove-message 屬性

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

關於訊息儲存區的說明

雖然我們很少關心 Claim Check 的詳細資訊(只要它們有效),但您應該知道 Spring Integration 中實際 Claim Check(指標)的目前實作使用 UUID 來確保唯一性。

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

  • SimpleMessageStore:基於記憶體內 Map 的實作(預設值,適用於測試)

  • JdbcMessageStore:使用 JDBC 上關聯式資料庫的實作