憑證檢查
在前面的章節中,我們介紹了幾個內容豐富器元件,它們可以幫助你處理訊息中缺少資料的情況。我們還討論了內容過濾,它允許你從訊息中移除資料項。然而,有時我們希望暫時隱藏資料。例如,在分散式系統中,我們可能會收到一個帶有非常大有效載荷的訊息。一些中間的訊息處理步驟可能不需要訪問此有效載荷,有些可能只需要訪問某些頭部,因此將大型訊息有效載荷透過每個處理步驟可能會導致效能下降,可能產生安全風險,並且可能使除錯更加困難。
在庫中儲存(或認領憑證)模式描述了一種機制,它允許你將資料儲存在一個眾所周知的地方,同時只維護一個指向該資料位置的指標(一個認領憑證)。你可以將該指標作為新訊息的有效載荷傳遞,從而讓訊息流中的任何元件在需要時立即獲取實際資料。這種方法與掛號信流程非常相似,你會在郵箱中收到一張認領憑證,然後必須去郵局認領你的實際包裹。這與航班後或酒店中的行李認領也是相同的想法。
Spring Integration 提供了兩種型別的認領憑證轉換器
-
入站認領憑證轉換器
-
出站認領憑證轉換器
提供了方便的基於名稱空間的機制來配置它們。
入站認領憑證轉換器
入站認領憑證轉換器透過將傳入訊息儲存在其 message-store 屬性標識的訊息儲存中來轉換傳入訊息。以下示例定義了一個入站認領憑證轉換器
<int:claim-check-in id="checkin"
input-channel="checkinChannel"
message-store="testMessageStore"
output-channel="output"/>
在前面的配置中,在 input-channel 上收到的訊息被持久化到由 message-store 屬性標識的訊息儲存中,並使用生成的 ID 進行索引。該 ID 是該訊息的認領憑證。該認領憑證也成為傳送到 output-channel 的新(轉換後的)訊息的有效載荷。
現在,假設在某個時候你需要訪問實際訊息。你可以手動訪問訊息儲存並獲取訊息內容,或者你可以使用相同的方法(建立轉換器),只是現在你透過使用出站認領憑證轉換器將認領憑證轉換為實際訊息。
以下列表提供了入站認領憑證轉換器所有可用引數的概述
<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 | 對要由該認領憑證轉換器使用的 MessageStore 的引用。如果未指定,預設引用是名為 messageStore 的 bean。可選。 |
| 5 | 當此端點作為訂閱者連線到通道時,指定呼叫的順序。當該通道使用 failover 排程策略時,這尤其相關。當此端點本身是帶有佇列的通道的輪詢消費者時,它沒有效果。此屬性在 Chain 元素內不可用。可選。 |
| 6 | 標識訊息在被此端點處理後傳送到的訊息通道。此屬性在 Chain 元素內不可用。可選。 |
| 7 | 指定傳送回覆訊息到輸出通道時等待的最大時間量(以毫秒為單位)。預設為 30 秒。此屬性在 Chain 元素內不可用。可選。 |
| 8 | 定義一個輪詢器。此元素在 Chain 元素內不可用。可選。 |
出站認領憑證轉換器
出站認領憑證轉換器允許你將帶有認領憑證有效載荷的訊息轉換為帶有原始內容作為其有效載荷的訊息。
<int:claim-check-out id="checkout"
input-channel="checkoutChannel"
message-store="testMessageStore"
output-channel="output"/>
在前面的配置中,在 input-channel 上收到的訊息的有效載荷應該是一個認領憑證。出站認領憑證轉換器透過查詢訊息儲存以獲取由提供的認領憑證標識的訊息,將其轉換為帶有原始有效載荷的訊息。然後它將新取出的訊息傳送到 output-channel。
以下列表提供了出站認領憑證轉換器所有可用引數的概述
<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 | 對要由該認領憑證轉換器使用的 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"/>