2017-06-23 54 views
1

我在遠程FTP中有一個文件,比如說「abc.txt」。該文件將每分鐘更新一次。我已經配置了我的FTP入站通道適配器,以便每分鐘檢索一次相同的文件。如何在Spring集成FTP入站通道適配器中替換舊的本地文件

這工作正常第一次(即本地目錄仍然是空的)。但是,第二次以後,中間文件abc.txt.writing不能替代原始的abc.txt文件。換句話說,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 
+0

如何使用'int-ftp:outbound-channel-adapter'而不是'int-ftp:inbound-channel-adapter'?因爲'int-ftp:outbound-channel-adapter'有一個屬性'mode =「REPLACE」',使用它你可以得到你想要的。條件是您應該使用彈簧集成版本4.1或更高版本。 –

+0

我正在使用SI 4.3.10。我正在從FTP下載文件並在下游組件中本地處理它(我沒有在上面的代碼片段中發佈下游組件的進程代碼)。 FTP出站通道適配器在這種情況下不起作用。 – user3544765

+0

也許您的下游代碼正在使用舊文件,以防止重命名操作成功。您也可以在下游處理中刪除該文件。 –

回答

1

FileWritingMessageHandler具有deleteSourceFiles選項,這是false默認。如果您使用<int-file:outbound-channel-adapter>,則是這種情況。

如果你以其他方式處理本地文件,例如<service-activator>,你應該考慮使用ExpressionEvaluatingRequestHandlerAdvice和成功執行File.delete()

<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:inbound-channel-adapter>的結果本地File

+0

這意味着最後爲您和Gary的建議,我應該總是刪除處理後的下載文件。之前我沒有嘗試這個的原因是我使用FileSystemPersistentAcceptOnceFileListFilter作爲本地過濾器。它應該允許我將舊文件保存在本地目錄中,而不是強制我在處理後刪除文件。 – user3544765

+0

該過濾器和目錄是不相關的球員。要過濾文件,您不需要目錄。但是,如果不將文件存儲在文件系統中,則無法使用文件。您可能會考慮使用'local-filename-generator-expression'在某些bean的現有文件中執行某些操作。 –

+0

但是,如果中間.writing文件無法重命名回實際文件名(如果實際文件名已存在),那麼SI FTP入站通道適配器將拋出異常會很好。目前,如果在重命名操作期間靜默失敗,發現問題並不容易。 – user3544765

相關問題