Spring 集成 Sftp 流式入站通道适配器多次处理同一文件
Spring Integration Sftp Streaming Inbound Channel Adapter processing same file multiple times
我正在使用 spring 集成 sftp 入站流媒体频道适配器,它每隔几秒轮询一次。入站适配器选择同一个文件进行多次处理。下面是配置。
<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 的子类,其中我将接受方法修改如下,根据 中的解决方案仅接受名称中包含当前日期的文件
public boolean accept(ChannelSftp.LsEntry file){
setPattern(new java.text.SimpleFormat("yyyyMMDD").format(new
java.util.Date())+".txt$"
super.accept(file);
}
面临的问题是同一个文件正在处理多个文件。该文件在处理后保留在同一远程目录中。我的过滤器配置有问题吗有人可以帮我解决这个问题吗?
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
我正在使用 spring 集成 sftp 入站流媒体频道适配器,它每隔几秒轮询一次。入站适配器选择同一个文件进行多次处理。下面是配置。
<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 的子类,其中我将接受方法修改如下,根据
public boolean accept(ChannelSftp.LsEntry file){
setPattern(new java.text.SimpleFormat("yyyyMMDD").format(new
java.util.Date())+".txt$"
super.accept(file);
}
面临的问题是同一个文件正在处理多个文件。该文件在处理后保留在同一远程目录中。我的过滤器配置有问题吗有人可以帮我解决这个问题吗?
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