2016-10-07 54 views
2

Spring集成中是否有一些組件可用於過濾指定時間範圍內的重複項?彈簧整合去抖/重複刪除

我在尋找類似Debounce from ReactiveX

在我的項目,我發送有效載荷包含一個UUID,我想篩選出具有相同UUID的多個有效載荷,如果在10秒內。例如通過隊列發送 - 然後我只想讓最後一個通過,只要在接下來的10秒內沒有其他有效載荷具有相同的UUID。

回答

1

感謝@Apokralipsa我能夠通過將以下聚合做到這一點:

<int:aggregator 
      input-channel="enrichedChannel" 
      output-channel="aggregatedChannel" 
      group-timeout-expression="size() ge 1 ? 10000 : -1" 
      send-partial-result-on-expiry="true" 
      expire-groups-upon-timeout="true" 
      correlation-strategy-expression="payload.id" 
      release-strategy-expression="false" /> 
3

您可以使用aggregator用於此目的。什麼,你需要設置爲

  • 認識到被複制
  • 釋放戰略考慮單個消息的消息是一個完成的組
  • expire-groups-upon-completionfalse,相關策略,讓本集團將不能因爲它是完成就被刪除併發送出去
  • group-timeout到,例如,10秒
  • 保持expire-groups-upon-timeouttrue(它是如此默認情況下)

從參考文檔:

expire-groups-upon-completion)設置爲真(默認爲false),完​​成組從消息存儲除去,允許具有相同相關性的後續消息,以形成一個新的組。默認行爲是將與完成組具有相同關聯性的消息發送到丟棄通道。

+0

我想勸告冪等接收器(http://docs.spring.io/spring-integration/reference /html/messaging-endpoints-chapter.html#idempotent-receiver),但具有'group-timeout'的Aggregator真的是更好的解決方案。有了適當的'releaseStrategy',你就可以在該時間窗口中只發出一條並且只發送最後一條消息。 –

+0

感謝您的幫助,這是正確的方向。我能夠配置聚合器,以便只有一個消息發送多個傳入。但它看起來像第一條消息一進入就發送,並且超時中的下一條消息不會被髮送。我會需要相反的:所有的消息應該保持,直到在超時沒有新的重複進來 - 然後最後的消息應該被髮送。 –