当前位置: 首页 > 知识库问答 >
问题:

Spring Integration Sftp流入站通道适配器多次处理同一文件

温镜
2023-03-14

我正在使用spring integration 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的一个子类,其中我将accept方法修改如下,以便根据Spring SFTP vanging filename-regex中提供的解决方案,只接受名称中有当前日期的文件

public boolean accept(ChannelSftp.LsEntry file){
setPattern(new java.text.SimpleFormat("yyyyMMDD").format(new 
java.util.Date())+".txt$"
super.accept(file);
}

面临的问题是同一个文件被处理多个文件。该文件在处理后保留在同一远程目录中。我的过滤器配置有问题吗?有人能帮我解决这个问题吗。

共有1个答案

怀飞掣
2023-03-14

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#文件读取

 类似资料:
  • 如果我创建一个SFTP入站通道适配器,并使用在SFTP中配置为channel属性的通道发送一些文件。文件将传输到SFTP远程目录本地目录,还是直接从通道流到本地目录

  • 问题内容: Spring Integration FTP中的入站通道适配器和出站通道适配器之间有什么区别?我应该使用哪一个?何时使用? 我从文档中了解到,出站可以发送任何类型的文件(例如byte [],String,java.io.File),但入站仅限于文件类型。那仅仅是区别还是其他? 问题答案: 我建议您首先阅读理论 。 任何Inbound适配器都旨在从外部系统获取数据。Outbound-放置

  • 问题内容: 入站和出站通道适配器之间的根本区别是什么? 任何示例都将非常有帮助。 我已经查看过Spring文档,这种“方向性”的区别对我来说还不清楚。我支持配置了outbound-channel-adapter的应用程序,但是我发现使用 出站 标签可以直观地了解行为计数器。该适配器获取一个外部文件,然后 将其 引入应用程序中, 在 该应用程序中我们解析文件并保留数据。 这类似于这个问题,但是我想更

  • 我们的应用程序使用一个Spring Integration轮询一个目录,以便在将文件丢弃到该目录时侦听该目录。然后,Spring Integration启动一个Spring批处理作业,将要处理的文件的路径和名称交给该作业。 显然,即使在Spring批处理作业处理了一个文件之后,文件轮询器仍在继续运行。因此,Spring上下文保持打开,应用程序不会终止。是否有一种方法,通过编程或配置(更好),在一个