重排序器

重排序器與訊息聚合器有關,但其目的不同。訊息聚合器合併訊息,而重排序器直接傳遞訊息而不改變它們。

功能

重排序器與訊息聚合器的工作方式類似,它們都使用 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。在這種情況下,會丟擲 MessageDeliveryException。對於 AbstractSubscribableChannel 實現,send-timeout 被忽略。對於 group-timeout(-expression),由排程過期任務產生的 MessageDeliveryException 會導致此任務被重新排程。可選。
9 對實現訊息關聯(分組)演算法的 bean 的引用。該 bean 可以是 CorrelationStrategy 介面的實現,也可以是一個 POJO。如果是 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。如果是 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 中移除。請注意,空組的實際過期時間也會受到清理器超時屬性的影響,最多可能等於此值加上超時時間。
16 參見使用 XML 配置訊息聚合器
17 參見使用 XML 配置訊息聚合器
18 參見使用 XML 配置訊息聚合器
19 參見使用 XML 配置訊息聚合器
20 預設情況下,當一個組因超時(或由 MessageGroupStoreReaper)完成時,保留空組的元資料。延遲到達的訊息會立即被丟棄。將此設定為 true 可以完全移除該組。然後,延遲到達的訊息會開始一個新的組,並且直到該組再次超時才會被丟棄。新組永遠不會正常釋放,因為導致超時的序列範圍中存在“空洞”。空組稍後可以使用 MessageGroupStoreReaperempty-group-min-timeout 屬性過期(完全移除)。從 5.0 版本開始,空組在 empty-group-min-timeout 時間過後也會被排程移除。預設值為 'false'。

另請參見訊息聚合器組過期以獲取更多資訊。

由於重排序器在 Java 類中沒有需要實現的自定義行為,因此它沒有註解支援。