聚合器,它根据相关性释放部分组,但保留其余消息

时间:2014-04-28 19:29:28

标签: spring-integration

我想在聚合器上设置关联策略,以便它使用传入文件中的日期(作为消息)名称来关联文件,以便所有具有今天日期的文件属于同一组。现在,因为我可能有多天的数据,所以我可能会聚合2天的文件。我希望将发布策略基于包含文件名中日期的完成文件(消息),因此基本上每天都会有一堆文件和文件完成。提取完成文件应该从聚合器中释放当天的文件,但仍保留其他日期文件,直到摄取该日的完成文件为止。

所以在这种情况下,相关性显然很简单 - 但我不确定的是如何根据相关键释放来自该组的所有特定消息。文档讨论了关于messagereaper的内容,但这些内容涉及到消息库的内容,我希望在内存中完成所有这些操作。

让我详细说明一下

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

进行轮询

文件1-2014.04.27.dat

文件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个文件被认为属于一个组,然后第二个2个文件属于第二个组..现在,一旦我使用了done-2014.04。那个27.dat文件我想释放前三个文件,在流程中进一步处理但是坚持

文件1-2014.04.28.dat

文件2-2014.04.28.dat

直到收到

完成-2014.04.28.dat

然后发布这两个文件。

任何帮助将不胜感激。 感谢

1 个答案:

答案 0 :(得分:0)

当你说“关联很简单”时,我不确定你是什么意思,但接着说你只想释放该组的一部分。如果他们有不同的日期,那么他们将在不同的组中,因此不需要释放组的一部分,只需在午夜之后(或第二天的任何时间)运行收割机来释放整个组。完全不清楚为什么你需要一个“完成”的消息。

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

编辑:

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

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

关于收割者;假设文件实时到达,我只是建议,如果你说,如果你每天运行一次收割机(比如01:00),组时间超过30分钟,那么收割机就会发布昨天的文件(没有需要done文件。

编辑:

请参阅下面您对“回答”的评论 - 您在filesLogger上有2位订阅者。