2017-03-01 117 views
1

我试图将远程文件从FTP仓库转移到本地仓库。目前它在初始传输方面起作用,并且如果本地文件被删除,但我希望它从最后修改的时间戳中获取远程文件更改。我已阅读尝试创建自定义过滤器,但无法找到有关通过Java DSL执行此操作的更多信息。春季集成FTP Java DSL

@Bean 
public IntegrationFlow ftpInboundFlow(){ 
    return IntegrationFlows 
      .from(s -> s 
        .ftp(this.ftpSessionFactory()) 
          .preserveTimestamp(true) 
          .remoteDirectory(ftpData.getRemoteDirectory()) 
          .localDirectory(new File(ftpData.getLocalDirectory())), 
        e -> e.id("ftpInboundAdapter").autoStartup(true)) 
      .channel(MessageChannels.publishSubscribe()) 
      .get(); 
} 

回答

0

它最近才被修正:https://jira.spring.io/browse/INT-4232

同时你没有选择,除非删除本地文件后处理。

您必须以任何方式使用FtpPersistentAcceptOnceFileListFilter,因为:https://jira.spring.io/browse/INT-4115

从Java DSL的角度来看没有任何东西。

UPDATE

你可以点我对如何通过Java DSL删除本地文件

FtpInboundFileSynchronizingMessageSource已经产生了消息的本地文件作为有效载荷。此外,还有像一些标题:

.setHeader(FileHeaders.RELATIVE_PATH, file.getAbsolutePath() 
         .replaceFirst(Matcher.quoteReplacement(this.directory.getAbsolutePath() + File.separator), 
           "")) 
.setHeader(FileHeaders.FILENAME, file.getName()) 
.setHeader(FileHeaders.ORIGINAL_FILE, file) 

当你对文件做下游已经可以通过常规File.delete()操作删除。可以使用ExpressionEvaluatingRequestHandlerAdvice例子来完成:

@Bean 
public Advice deleteFileAdvice() { 
    ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice(); 
    advice.setOnSuccessExpressionString("headers[file_originalFile].delete()"); 
    return advice; 
} 

... 
.<String>handle((p, h) -> ..., e -> e.advice(deleteFileAdvice())) 
+0

因此,要克服这个我会运行FTP服务,因此获取最新的远程文件之前删除我的本地文件?它是否正确? – JamieUser

+0

正确。并使其永久工作,你必须在下游处理后删除本地文件。 –

+0

非常感谢,你能指点我如何通过Java DSL删除本地文件,如果不通过Java Config? – JamieUser