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

时间:2018-08-07 12:57:56

标签: spring spring-integration spring-integration-sftp

我正在使用每隔几秒钟轮询一次的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的子类,根据Spring SFTP varying filename-regex

中的解决方案,我对其中的accept方法进行了如下修改,以仅接受名称中具有当前日期的文件。
public boolean accept(ChannelSftp.LsEntry file){
setPattern(new java.text.SimpleFormat("yyyyMMDD").format(new 
java.util.Date())+".txt$"
super.accept(file);
}

面临的问题是同一文件正在处理多个文件。处理后,文件将保留在同一远程目录中。我的过滤器配置是否存在问题?有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

const request = require("request") request.get({url: "http://.../api/v1/users/getprofile", qs: {"accessToken": "xxxxx"}}, function(err, response, body) { console.log(err, body); }) 基于对象哈希,与此同时,AcceptOnceFileListFilter生成一个SftpStreamingMessageSource,其中创建的每个新对象(即使具有相同文件名)也具有自己的新哈希。

您需要使其工作的LsEntry已经完成了您想要实现的目标。

此外,我建议使用SftpPersistentAcceptOnceFileListFilter代替ChainFileListFilter。这样,如果文件未通过CompositeFileListFilter,则文件不会到达该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