Spring 文件入站通道适配器同时处理同一文件

Spring 文件入站通道适配器同时处理同一文件,spring,spring-integration,Spring,Spring Integration,我需要处理放在特定文件夹中的任何文件。这些文件可以有相同的名称。稍后,它将由一个专有bean处理,该bean将根据文件名的重复状态重命名文件扩展名(如果以前从未处理过该文件,则为xxx.origin;如果以前从未处理过该文件,则为xxx.duplicate,则为相反条件) 基于这个需求,我决定使用文件入站通道适配器,使用spring-integration-3.0.8。我将防止重复属性设置为false,以便处理所有文件。然而,我发现2个文件入站通道适配器可以同时处理1个文件(即使第二个适配器是意

我需要处理放在特定文件夹中的任何文件。这些文件可以有相同的名称。稍后,它将由一个专有bean处理,该bean将根据文件名的重复状态重命名文件扩展名(如果以前从未处理过该文件,则为xxx.origin;如果以前从未处理过该文件,则为xxx.duplicate,则为相反条件)

基于这个需求,我决定使用
文件入站通道适配器
,使用
spring-integration-3.0.8
。我将
防止重复
属性设置为
false
,以便处理所有文件。然而,我发现2个
文件入站通道适配器可以同时处理1个文件(即使第二个适配器是意外创建的,在上下文和servlet中初始化了两次)。但这对我来说是一个问题,因为我实际上打算创建多个
文件入站通道适配器来处理同一文件夹中的所有文件,结果是2个bean同时处理1个输入文件两次,从而得到2个输出文件(xxx.origin和xxx.duplicate)。我也不能使用
FileLocker
,因为
文件到字符串转换器
由于文件的锁定状态而无法工作


有什么方法可以满足要求吗?

不清楚为什么需要多个适配器轮询同一目录-如果需要实现并发处理,请使用单个适配器并向轮询器添加任务执行器(或使用下游执行器通道)

如果您必须有多个适配器实例,并且可以使用较新版本的Spring Integration(4.1.7或更高版本,当前版本为4.2.6),则可以使用共享的
AcceptOnceFileListFilter
,它现在是
ResettableFileListFilter
,因此重命名文件时可以将其从筛选器中删除


如果您无法转到较新版本的Spring Integration,则需要一个自定义的
FileListFilter
,它允许您在处理后删除文件。

Hi Gary,感谢您的回复。我需要多个适配器轮询同一目录,因为我的想法是使用多个bean来处理目录中的大量文件。因此,我希望使用4个bean,而不是1个bean来处理100个文件,这样所有文件都可以更快地处理。目前我的配置是文件入站适配器->文本到字符串转换器->服务激活器->文件出站适配器。服务激活器是我处理文件的专有bean。因此,我认为我必须使用上述4组配置。但是,使用一个适配器和一个具有4个线程的池任务执行器可以实现同样的效果。您好@GaryRussell,如果应用程序在多个服务器上运行(活动),该怎么办?您能推荐一种方法来确保只有一台服务器会使用该文件吗;不要对4岁的答案提出新问题。