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
中移除,使其無法再次認領。
就儲存空間而言,此功能具有影響,尤其是在基於記憶體內 Map
的 SimpleMessageStore
的情況下,未能移除訊息最終可能會導致 OutOfMemoryException
。因此,如果您不期望進行多次認領,我們建議您將 remove-message
屬性的值設定為 true
。以下範例顯示如何使用 remove-message
屬性
<int:claim-check-out id="checkout"
input-channel="checkoutChannel"
message-store="testMessageStore"
output-channel="output"
remove-message="true"/>