重排序器
重序器與聚合器相關,但服務於不同的目的。聚合器組合訊息,而重序器則不改變訊息地傳遞它們。
功能
重序器的工作方式與聚合器類似,因為它使用 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。在後一種情況下,還必須定義 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 中移除,直到它們至少在此毫秒數內未被修改。請注意,空組的實際過期時間也受收割者的超時屬性影響,它可能最多是此值加上超時。 |
| 16 | 請參閱使用 XML 配置聚合器。 |
| 17 | 請參閱使用 XML 配置聚合器。 |
| 18 | 請參閱使用 XML 配置聚合器。 |
| 19 | 請參閱使用 XML 配置聚合器。 |
| 20 | 預設情況下,當組因超時(或由 MessageGroupStoreReaper)而完成時,空組的元資料會被保留。遲到的訊息會立即被丟棄。將其設定為 true 可完全移除組。然後,遲到的訊息將開始一個新的組,並且在組再次超時之前不會被丟棄。新組永遠不會正常釋放,因為序列範圍中的“空洞”導致了超時。空組以後可以使用 MessageGroupStoreReaper 和 empty-group-min-timeout 屬性過期(完全移除)。從 5.0 版本開始,空組也會在 empty-group-min-timeout 過去後計劃移除。預設值為“false”。 |
另請參閱聚合器過期組以獲取更多資訊。
| 由於在 Java 類中沒有為重序器實現自定義行為,因此不支援對其進行註解。 |