2013-01-22 154 views
0

我們正在嘗試在Camel中構建一個流程服務器。我們有幾個客戶端,通過FTP提供文件。我們必須鏡像ftp文件,但我們只想下載我們還沒有的文件。客戶端的服務器必須保持不變,因此不允許更改,只能讀取。Apache Camel和FTP處理

String to = DownloadFolder.getInstance().getDownloadFolder() + File.separator + "test"; 
       from("ftp://[email protected]/downloads/&binary=true&stepwise=false&localWorkDirectory=/tmp")// 
         .process(new ProcessCheckForDownload(to))// 
         .to("file://" + to + "?keepLastModified=true")// 
         .to("jms:queue:FTP_FILE_RECEIVED"); 

問題是,該ftp正在下載文件,然後才能檢查下載。當設置download = false時,我將能夠檢查下載,但是如何繼續。至少現在我無法處理單個文件進行下載。接下來的問題是,這個工作被打破了,因爲jms希望得到臨時文件,而不是最終文件。

也許任何人都有一個關於如何繼續解決這個問題的提示。

回答

1

該文件和因此FTP組件具有內置的此功能。它被稱爲idempotent consumer。基本上,您可以在端點上通過idempotent=true開啓此功能。

缺省的冪等回購不會在服務器重啓時存活,因爲它將關於已讀取文件的數據存儲在內存中。您可以使用持續的冪等回購,例如File based idempotent repository(或某些database repos或您的自定義類)。

file頁面上有很多示例,因爲FTP組件繼承自File,同樣的事情適用於(大部分)。

順便說一下,download=false功能僅適用於駱駝2.11,它尚未發佈。

+0

不幸的是,功能idempotent = true實際上只檢查文件名。文件更新後,它不能識別這些更改。但這是我們的一個要求。 – xyx

+2

是的,這是一個好主意,允許人們自定義密鑰並指定包含時間戳等。我已經登錄了一張票:https://issues.apache.org/jira/browse/CAMEL-6006 –

+0

@ClausIbsen:我試過了使用indempotentKey與2.11-SNAPSHOT和sftp方案,但駱駝抱怨一個未知的參數。更改隻影響文件組件,還是應該可以通過sftp使用indempotentKey? – mdo

0

我想我們必須擴展GenericFileConsumer的isValidFile方法。

protected boolean isValidFile(GenericFile<T> file, boolean isDirectory) { 
     if (!isMatched(file, isDirectory)) { 
      log.trace("File did not match. Will skip this file: {}", file); 
      return false; 
     } else if (endpoint.isIdempotent() && endpoint.getIdempotentRepository()**.contains(file.getAbsoluteFilePath())**) { 
      log.trace("This consumer is idempotent and the file has been consumed before. Will skip this file: {}", file); 
      return false; 
     }  
     // file matched 
     return true; 
    } 

我們必須生成自己的密鑰,其中包含上次更改的大小和日期。我認爲這會做到這一點。

.contains(file.getAbsoluteFilePath()+":"+file.getFileLength()+":"+file.getLastModified()) 

我們所要做的就是創造我們自己的消費者。

+1

我在ASF登錄了一張JIRA票證以改善此情況:https://issues.apache.org/jira/browse/CAMEL-6006 –