Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring integration 基于相关性释放部分组但保留其余消息的聚合器_Spring Integration - Fatal编程技术网

Spring integration 基于相关性释放部分组但保留其余消息的聚合器

Spring integration 基于相关性释放部分组但保留其余消息的聚合器,spring-integration,Spring Integration,我想在聚合器上设置关联策略,以便它使用传入文件(作为消息)名称之外的日期来关联文件,以便所有具有今天日期的文件都属于同一组。现在,由于我可能有多天的数据,我可能已经聚合了2天的文件。我想基于一个完成的文件(消息)的发布策略,该文件包括文件名中的日期,因此基本上每天都会有一堆文件和一个完成文件。摄取完成的文件应该从聚合器中释放当天的文件,但仍然保留其他日期的文件,直到摄取当天的完成文件 所以在这个场景中,关联显然很简单——但我不确定的是如何根据关联键发布组中的所有消息,而只是一些特定消息。文档中谈

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

所以在这个场景中,关联显然很简单——但我不确定的是如何根据关联键发布组中的所有消息,而只是一些特定消息。文档中谈到了messagereaper,但这涉及到messagestore的内容,我想在内存中完成所有这些

让我举例说明

我把这些文件放在一个目录上,该目录由文件入站通道适配器进行im轮询

文件-1-2014.04.27.dat

done-2014.04.27.dat
文件-2-2014.04.27.dat

done-2014.04.27.dat
文件-3-2014.04.27.dat

done-2014.04.27.dat
文件-1-2014.04.28.dat

done-2014.04.28.dat
文件-2-2014.04.28.dat

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

文件-1-2014.04.28.dat

done-2014.04.28.dat
文件-2-2014.04.28.dat

done-2014.04.28.dat
直到我收到

完成日期:2014年4月28日

done-2014.04.28.dat
然后释放这两个文件

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

我不知道你说的“相关性很简单”是什么意思,但接着又说,你只想发布团队的一部分。如果他们有不同的日期,那么他们将在不同的组中,因此不需要释放组中的一部分,只需在午夜后(或第二天的任何时间)运行收割器来释放整个组。根本不清楚为什么你需要一个“完成”的信息

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

编辑:

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

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

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

编辑:


请参阅下面我对您的“答案”的评论-您在
文件记录器上有2个订阅者

抱歉,我想我没有澄清某些事情,请查看更新的描述。。我也很好奇,所以你刚才提到的时间因素是我在预定的时间间隔运行收割器?谢谢,这非常有用。。仍然遇到一些问题,尽管我将这些问题作为另一个答案发布在同一个线程/帖子中