重新排序器
重新排序器與彙集器相關,但用途不同。彙集器結合訊息,而重新排序器則傳遞訊息而不變更它們。
功能
重新排序器的工作方式與彙集器類似,因為它使用 CORRELATION_ID
將訊息儲存在群組中。不同之處在於,重新排序器不會以任何方式處理訊息。相反地,它會依照訊息的 SEQUENCE_NUMBER
標頭值順序釋放它們。
關於這一點,您可以選擇一次釋放所有訊息(在整個序列之後,根據 SEQUENCE_SIZE
和其他可能性),或在有效序列可用時立即釋放。(我們稍後在本章中說明「有效序列」的含義。)
重新排序器旨在重新排序相對較短的訊息序列,這些序列具有小的間隙。如果您有大量具有許多間隙的不連續序列,您可能會遇到效能問題。 |
設定重新排序器
請參閱彙集器和重新排序器,以了解如何在 Java DSL 中設定重新排序器。
設定重新排序器只需要在 XML 中包含適當的元素。
以下範例顯示重新排序器設定
<int:channel id="inputChannel"/>
<int:channel id="outputChannel"/>
<int:resequencer id="completelyDefinedResequencer" (1)
input-channel="inputChannel" (2)
output-channel="outputChannel" (3)
discard-channel="discardChannel" (4)
release-partial-sequences="true" (5)
message-store="messageStore" (6)
send-partial-result-on-expiry="true" (7)
send-timeout="86420000" (8)
correlation-strategy="correlationStrategyBean" (9)
correlation-strategy-method="correlate" (10)
correlation-strategy-expression="headers['something']" (11)
release-strategy="releaseStrategyBean" (12)
release-strategy-method="release" (13)
release-strategy-expression="size() == 10" (14)
empty-group-min-timeout="60000" (15)
lock-registry="lockRegistry" (16)
group-timeout="60000" (17)
group-timeout-expression="size() ge 2 ? 100 : -1" (18)
scheduler="taskScheduler" /> (19)
expire-group-upon-timeout="false" /> (20)
1 | 重新排序器的 ID 是可選的。 |
2 | 重新排序器的輸入通道。必要。 |
3 | 重新排序器將重新排序的訊息傳送到的通道。可選。 |
4 | 重新排序器將逾時訊息傳送到的通道(如果 send-partial-result-on-timeout 設定為 false )。可選。 |
5 | 是要在有效順序可用時立即傳送排序的順序,還是僅在整個訊息群組到達後才傳送。可選。(預設值為 false 。) |
6 | 對 MessageGroupStore 的參考,可用於將訊息群組儲存在其關聯鍵下,直到它們完成為止。可選。(預設值為揮發性記憶體內儲存區。) |
7 | 群組過期時,是否應傳送排序的群組(即使遺失某些訊息)。可選。(預設值為 false。)請參閱彙集器中的狀態管理:MessageGroupStore 。 |
8 | 傳送回覆 Message 到 output-channel 或 discard-channel 時的逾時間隔。它僅在輸出通道具有某些「傳送」限制時套用,例如具有固定「容量」的 QueueChannel 。在這種情況下,會擲回 MessageDeliveryException 。send-timeout 會被 AbstractSubscribableChannel 實作忽略。對於 group-timeout(-expression) ,來自排定的過期任務的 MessageDeliveryException 會導致此任務重新排程。可選。 |
9 | 對實作訊息關聯(群組)演算法的 bean 的參考。bean 可以是 CorrelationStrategy 介面或 POJO 的實作。在後一種情況下,也必須定義 correlation-strategy-method 屬性。可選。(預設情況下,彙集器使用 IntegrationMessageHeaderAccessor.CORRELATION_ID 標頭。) |
10 | 在 correlation-strategy 參考的 bean 上定義且實作關聯決策演算法的方法。可選,具有限制(需要存在 correlation-strategy )。 |
11 | 代表關聯策略的 SpEL 運算式。範例:"headers['something']" 。僅允許 correlation-strategy 或 correlation-strategy-expression 其中之一。 |
12 | 對實作釋放策略的 bean 的參考。bean 可以是 ReleaseStrategy 介面或 POJO 的實作。在後一種情況下,也必須定義 release-strategy-method 屬性。可選(預設情況下,彙集器將使用 IntegrationMessageHeaderAccessor.SEQUENCE_SIZE 標頭屬性)。 |
13 | 在 release-strategy 參考的 bean 上定義且實作完成決策演算法的方法。可選,具有限制(需要存在 release-strategy )。 |
14 | 代表釋放策略的 SpEL 運算式。運算式的根物件是 MessageGroup 。範例:"size() == 5" 。僅允許 release-strategy 或 release-strategy-expression 其中之一。 |
15 | 僅適用於為 <resequencer> MessageStore 設定 MessageGroupStoreReaper 的情況。預設情況下,當 MessageGroupStoreReaper 設定為使部分群組過期時,也會移除空群組。在正常釋放群組後,會存在空群組。這是為了啟用對延遲到達訊息的偵測和捨棄。如果您希望空群組的過期排程比部分群組的過期排程更長,請設定此屬性。然後,在空群組至少在此毫秒數內未修改之前,不會從 MessageStore 中移除空群組。請注意,使空群組過期的實際時間也受到 Reaper 的 timeout 屬性的影響,並且可能達到此值加上逾時時間。 |
16 | 請參閱使用 XML 設定彙集器。 |
17 | 請參閱使用 XML 設定彙集器。 |
18 | 請參閱使用 XML 設定彙集器。 |
19 | 請參閱使用 XML 設定彙集器。 |
20 | 預設情況下,當群組由於逾時(或由 MessageGroupStoreReaper )而完成時,會保留空群組的中繼資料。延遲到達的訊息會立即捨棄。將此設定為 true 以完全移除群組。然後,延遲到達的訊息會啟動新群組,並且在群組再次逾時之前不會捨棄。由於導致逾時的序列範圍中的「漏洞」,新群組永遠不會正常釋放。稍後可以使用 MessageGroupStoreReaper 與 empty-group-min-timeout 屬性一起使空群組過期(完全移除)。從 5.0 版開始,也會排程在 empty-group-min-timeout 經過後移除空群組。預設值為「false」。 |
另請參閱彙集器過期群組以取得更多資訊。
由於重新排序器沒有要在 Java 類別中實作的自訂行為,因此沒有對它的註解支援。 |