2017-03-01 192 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