spring-integration-聚合器,它基于相关性释放部分组,但保留其余消息



我想在聚合器上设置相关策略,使其使用传入文件(作为消息)名称中的日期来关联文件,使所有具有今天日期的文件都属于同一组。现在,由于我可能有多天的数据,我可能已经聚合了2天的文件。我想把发布策略建立在一个完成文件(消息)的基础上,该文件也包括文件名中的日期,这样基本上每天都会有一堆文件和一个完成的文件。摄入已完成的文件应该从聚合器中释放当天的文件,但在摄入当天的已完成文件之前,仍然保留其他日期的文件。

因此,在这种情况下,关联显然很简单,但我不确定的是,如何根据关联键从组中释放一些特定消息,而不是全部消息。文档谈到了messagereaper,但它进入了messagestore的内容,我想在内存中完成所有这些。

让我以为例详细说明

我在一个目录上有这些文件,该目录由文件入站通道适配器轮询

文件-1-2014.04.27.at

文件-2-2014.04.27.dat

文件-3-2014.04.27.dat

done-2014.04.27.dat

文件-1-2014.04.28.dat

文件-2-2014.04.28.dat

done-2014.04.28.dat

当这些文件被轮询时,我在流中有一个聚合器,所有传入的文件都被聚合。为了进行关联,我想我可以提取日期并将其放在correlation_id标头中,这样前3个文件就被认为属于一个组,然后第二个文件属于第二组。。现在,当我使用done-2014.04.27.dat文件时,我想释放前3个文件以在流中进行进一步处理,但要保留

文件-1-2014.04.28.dat

文件-2-2014.04.28.dat

直到我收到

done-2014.04.28.dat

然后释放这两个文件。

如有任何帮助,我们将不胜感激。感谢

我不确定你说"相关性很简单"是什么意思,但接着说你只想发布部分组。如果他们有不同的日期,那么他们将分在不同的小组中,所以没有必要释放一个小组的一部分,只需在午夜后(或第二天的任何时候)运行收割者就可以释放整个小组。现在还不清楚你为什么需要一个"完成"的信息。

默认情况下,聚合器使用内存中的消息存储(SimpleMessageStore)。

编辑:

只需将done文件放在同一组中,然后让您的发布策略检测done文件的存在。您可以使用表达式,但如果组可以很大,则实现ReleaseStrategy并在MessageGroup.getMessages()上迭代查找done文件会更有效。

下一步取决于聚合器下游的内容。如果使用拆分器将它们拆分回单独的文件,则只需添加一个筛选器即可删除done文件。如果直接处理文件集合,请忽略已完成的文件,或者添加转换器将其从集合中删除。

关于收割者;假设文件是实时到达的,我只是建议,如果你每天运行一次reaper(比如01:00),组超时时间为30分钟,那么reaper将释放昨天的文件(不需要done文件)。

编辑:

请参阅我对以下"答案"的评论-您在filesLogger上有2个订阅者。

最新更新