我正在使用spring integration sftp inbound流媒体通道适配器,每隔几秒轮询一次 . 入站适配器正在选择相同的文件以进行多次处理 . 以下是配置 .
<int-sftp:inbound-streaming-channel-adapter id="ftpInbound"
channel="ftpChannel"
session-factory="sessionFactory"
filter="filter"
remote-file-separator="/"
remote-directory="/sampleFolder" auto-startup="true">
<int:poller fixed-rate="30000" max-messages-per-poll="1" />
</int-sftp:inbound-streaming-channel-adapter>
<int:stream-transformer id="withCharset" charset="UTF-8"
input-channel="ftpChannel" output-channel="outputChannel"/>
<bean id="filter"
class="org.springframework.integration.file.filters.CompositeFileListFilter">
<constructor-arg>
<list>
<bean
class="sample.CustomFilter">
</bean>
<bean
class="org.springframework.integration.file.filters.
AcceptOnceFileListFilter"/>
</list>
</constructor-arg>
上面代码中的sample.CustomFilter是SftpRegexPatternFileListFilter的子类,其中我按照下面的方法修改了accept方法,只接受名称中当前日期的文件,按照Spring SFTP varying filename-regex中的解决方案
public boolean accept(ChannelSftp.LsEntry file){
setPattern(new java.text.SimpleFormat("yyyyMMDD").format(new
java.util.Date())+".txt$"
super.accept(file);
}
面临的问题是处理多个文件的同一文件 . 处理完成后,文件将保留在同一个远程目录中 . 我的过滤器配置是否存在问题有人可以帮我解决这个问题 .
1 回答
AcceptOnceFileListFilter
基于对象哈希,同时SftpStreamingMessageSource
产生LsEntry
,其中每个新对象都被创建,即使具有相同的文件名也有自己的新哈希 .你需要使它工作的是
SftpPersistentAcceptOnceFileListFilter
,它已经完成了你想要达到的目标 .另外我建议使用
ChainFileListFilter
而不是CompositeFileListFilter
. 这样,如果文件没有通过CustomFilter
,文件将不会到达SftpPersistentAcceptOnceFileListFilter
. 因此,对于我们根本不感兴趣的文件没有额外的内存消耗 .请参阅“参考手册”中的更多信息:
https://docs.spring.io/spring-integration/docs/current/reference/html/sftp.html#sftp-inbound
https://docs.spring.io/spring-integration/docs/5.0.7.RELEASE/reference/html/files.html#file-reading