重排序器
重排序器與訊息聚合器有關,但其目的不同。訊息聚合器合併訊息,而重排序器直接傳遞訊息而不改變它們。
功能
重排序器與訊息聚合器的工作方式類似,它們都使用 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 。對於 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-strategy 或 correlation-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-strategy 或 release-strategy-expression 只能二選一。 |
15 | 僅當為 <resequencer> 的 MessageStore 配置了 MessageGroupStoreReaper 時才適用。預設情況下,當配置 MessageGroupStoreReaper 以使部分組過期時,空組也會被移除。空組在組正常釋放後存在。這是為了啟用對延遲到達訊息的檢測和丟棄。如果希望以比部分組過期更長的週期使空組過期,請設定此屬性。然後,空組直到至少在此毫秒數內未被修改後才會從 MessageStore 中移除。請注意,空組的實際過期時間也會受到清理器超時屬性的影響,最多可能等於此值加上超時時間。 |
16 | 參見使用 XML 配置訊息聚合器。 |
17 | 參見使用 XML 配置訊息聚合器。 |
18 | 參見使用 XML 配置訊息聚合器。 |
19 | 參見使用 XML 配置訊息聚合器。 |
20 | 預設情況下,當一個組因超時(或由 MessageGroupStoreReaper )完成時,保留空組的元資料。延遲到達的訊息會立即被丟棄。將此設定為 true 可以完全移除該組。然後,延遲到達的訊息會開始一個新的組,並且直到該組再次超時才會被丟棄。新組永遠不會正常釋放,因為導致超時的序列範圍中存在“空洞”。空組稍後可以使用 MessageGroupStoreReaper 和 empty-group-min-timeout 屬性過期(完全移除)。從 5.0 版本開始,空組在 empty-group-min-timeout 時間過後也會被排程移除。預設值為 'false'。 |
另請參見訊息聚合器組過期以獲取更多資訊。
由於重排序器在 Java 類中沒有需要實現的自定義行為,因此它沒有註解支援。 |