重新排序器

重新排序器與彙集器相關,但用途不同。彙集器結合訊息,而重新排序器則傳遞訊息而不變更它們。

功能

重新排序器的工作方式與彙集器類似,因為它使用 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 傳送回覆 Messageoutput-channeldiscard-channel 時的逾時間隔。它僅在輸出通道具有某些「傳送」限制時套用,例如具有固定「容量」的 QueueChannel。在這種情況下,會擲回 MessageDeliveryExceptionsend-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-strategycorrelation-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-strategyrelease-strategy-expression 其中之一。
15 僅適用於為 <resequencer> MessageStore 設定 MessageGroupStoreReaper 的情況。預設情況下,當 MessageGroupStoreReaper 設定為使部分群組過期時,也會移除空群組。在正常釋放群組後,會存在空群組。這是為了啟用對延遲到達訊息的偵測和捨棄。如果您希望空群組的過期排程比部分群組的過期排程更長,請設定此屬性。然後,在空群組至少在此毫秒數內未修改之前,不會從 MessageStore 中移除空群組。請注意,使空群組過期的實際時間也受到 Reaper 的 timeout 屬性的影響,並且可能達到此值加上逾時時間。
16 請參閱使用 XML 設定彙集器
17 請參閱使用 XML 設定彙集器
18 請參閱使用 XML 設定彙集器
19 請參閱使用 XML 設定彙集器
20 預設情況下,當群組由於逾時(或由 MessageGroupStoreReaper)而完成時,會保留空群組的中繼資料。延遲到達的訊息會立即捨棄。將此設定為 true 以完全移除群組。然後,延遲到達的訊息會啟動新群組,並且在群組再次逾時之前不會捨棄。由於導致逾時的序列範圍中的「漏洞」,新群組永遠不會正常釋放。稍後可以使用 MessageGroupStoreReaperempty-group-min-timeout 屬性一起使空群組過期(完全移除)。從 5.0 版開始,也會排程在 empty-group-min-timeout 經過後移除空群組。預設值為「false」。

另請參閱彙集器過期群組以取得更多資訊。

由於重新排序器沒有要在 Java 類別中實作的自訂行為,因此沒有對它的註解支援。