最后一条记录过滤时的Spring Integration聚合器

时间:2016-09-12 17:19:04

标签: spring integration aggregator

我们有一个Spring Integration项目,其中一个大型输入文件突发到许多单独的文件中,然后使用Spring Integration Aggregator聚合在一起。

管道中有许多过滤器会过滤掉不需要的单个文件。我们会跟踪为每个相关输入文件过滤的文件数。我们的@ReleaseStrategy检查我们是否收到了单个文件的数量减去过滤的单个文件的数量。

如果要处理的最后一个文件在到达ReleaseStrategy之前被过滤,会发生什么? ReleaseStrategy是为每个到达它的单个文件调用的,如果最后一个文件被过滤,我不会被再次轮询,但我也希望Spring能够预见到这个用例并为它提供了一些非hackish条款,它仍然提供我参加了@Aggregator活动。如果我超时或者我导致所有过滤点检查它们是否是最后一个文件,我不会收到@Aggregator事件。

谢谢!

1 个答案:

答案 0 :(得分:0)

Split-filter-aggregate模式的正确答案是在聚合器bean上设置以下属性。

send-partial-result-on-expiry="true"
group-timeout="5000"

这两个属性共同处理与所描述的情况完全相同的情况,其中我们的ReleaseStrategy从未使用最后一条记录调用,因为最后一条记录已被过滤。一旦达到超时,这些设置将导致排队等待释放的任何内容。

超时是一个“静默期”,如果在超时内没有收到给定CorrelationStrategy的消息,那么聚合发布。收到的每条消息都会重置超时。见第(21)节: http://docs.spring.io/spring-integration/reference/htmlsingle/