Spring integration 如何在Spring Integration FTP入站通道适配器中替换旧的本地文件

Spring integration 如何在Spring Integration FTP入站通道适配器中替换旧的本地文件,spring-integration,Spring Integration,我有一个远程FTP文件,比如“abc.txt”。此文件将每分钟更新一次。我已将FTP入站通道适配器配置为每分钟检索同一个文件 这是第一次正常工作(即本地目录仍然为空)。但是,在第2次之后,中间文件abc.txt.write无法替换原始的abc.txtfile。换句话说,abc.txt(旧版本)和abc.txt.writing将共存于同一目录中。(使用新版本数据)。(无错误提示) 是我遇到了错误,还是我必须设置一些参数,以便先删除文件的旧版本,以便成功重命名abc.txt.writing <

我有一个远程FTP文件,比如“abc.txt”。此文件将每分钟更新一次。我已将FTP入站通道适配器配置为每分钟检索同一个文件

这是第一次正常工作(即本地目录仍然为空)。但是,在第2次之后,中间文件
abc.txt.write
无法替换原始的
abc.txt
file。换句话说,
abc.txt
(旧版本)和
abc.txt.writing
将共存于同一目录中。(使用新版本数据)。(无错误提示)

是我遇到了错误,还是我必须设置一些参数,以便先删除文件的旧版本,以便成功重命名
abc.txt.writing

<bean id="ftpSessionFactory"
      class="org.springframework.integration.ftp.session.DefaultFtpSessionFactory"
      p:host="127.0.0.1"
      p:port="21"
      p:username="myusername"
      p:password="mypassword">

<bean id="cachingSessionFactory" class="org.springframework.integration.file.remote.session.CachingSessionFactory">
        <constructor-arg ref="ftpSessionFactory" />
        <constructor-arg value="1" />
        <property name="sessionWaitTimeout" value="1000" />
</bean>

<int-ftp:inbound-channel-adapter id="myChannel"
                                     channel="nullChannel"
                                     session-factory="cachingSessionFactory"
                                     filename-pattern="abc.txt"
                                     remote-directory="/"
                                     preserve-timestamp="true"
                                     local-directory="c:/temp">
    <int:poller cron="15 * * * * ?" max-messages-per-poll="1" />
</int-ftp:inbound-channel-adapter>



c:\temp> dir /a
06/23/2017  11:44 AM           840,000 abc.txt
06/23/2017  11:45 AM           840,000 abc.txt.writing

c:\temp>dir/a
2017年6月23日上午11:44 840000 abc.txt
2017年6月23日上午11:45 840000 abc.txt.writing

FileWritingMessageHandler具有
deleteSourceFiles
选项,默认情况下该选项为
false
。如果您使用
,情况就是这样

如果您以其他方式处理本地文件,例如“代码> <代码>,则应考虑使用<代码>表达式计算Reqththand Lead建议< /C> >并执行<代码>文件.DELTER()<代码> >:

<int:request-handler-advice-chain>
        <bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">
            <property name="onSuccessExpressionString" value="payload.delete()"/>
        </bean>
    </int:request-handler-advice-chain>


其中,由于

使用
int-ftp:outbound channel adapter
而不是
int-ftp:inbound channel adapter
,该
有效载荷正好是本地
文件
?因为
int ftp:outbound channel adapter
有一个属性
mode=“REPLACE”
,您可以使用该属性获得所需的内容。条件是您应该使用spring集成版本4.1或更高版本。我使用的是SI 4.3.10。我正在从FTP下载一个文件,并在下游组件中本地处理它(我没有在上面的代码片段中发布下游组件的处理代码)。FTP出站通道适配器在这种情况下对我没有帮助。可能您的下游代码正在使用旧文件,从而阻止重命名操作的成功。您还可以在下游处理中删除该文件。Gary,我已尝试删除下游代码(我已使用ftp:inbound channel adapter中的频道更改为nullChannel进行了测试),但问题仍然存在。现在唯一的方法是在处理后删除旧文件(我将下载文件移动到另一个目录进行处理)。但我认为它应该允许我覆盖旧文件,而不是保留中间.writing文件而不显示任何错误消息。最初,我希望使用单个目录进行下载和处理(我将根据最后一张图像和当前图像生成增量内容文件).这意味着您和Gary的建议是,在处理后,我应该始终删除下载的文件。我以前没有尝试过这一点的原因是我正在使用FileSystemTempersistentAcceptonCefileListFilter作为本地筛选器。它应该允许我将旧文件保存在本地目录中,而不是强制我在处理后删除该文件。过滤器和目录不是相关的播放器。要过滤文件,您不需要目录。但是,如果不将文件存储在文件系统中,则无法处理这些文件。您可以考虑使用<代码>本地文件名生成器表达式< /代码>来对某些bean中的现有文件做一些事情。但是如果中间写文件无法重命名为实际文件名(如果实际文件名已经存在),那么如果Si-FTP入站通道适配器将抛出异常,那会是很好的。目前,如果在重命名操作期间默默失败,则不容易发现问题。Hm。查看
preserveTimestamp
周围的代码,我认为这是一个bug,当远程文件进行修改时,我们必须覆盖
localFile
。请继续,并针对这个用例提出JIRA:不清楚您的意思。本地
文件系统TempersistentAcceptOnceFileListFilter在远程文件复制到本地目录后才会工作。
本地筛选器
文件读取消息源
的一部分。因此,重命名不会失败,因为没有本地文件。但是,是的,
filesystemtempersistanceptoncefileListFilter
可能无法通过该过滤器,因为您在删除文件期间没有清除该过滤器的记录。因此,如果您从顶层应用程序考虑,您应该从本地目录中删除文件,并调用
ResettableFileListFilter.remove()