2014-08-28 128 views
2

我有一個預計將各種文件複製到傳入文件夾的路線。路線將繼續移動這些文件到一個臨時文件夾,在那裏它會做其他的事情。路線如下:Apache Camel - 將大文件複製到使用者文件夾

 <route id="incoming" > 
      <from uri="file://my/path/incoming"/> 
      <to uri="file://my/path/incoming/temp"/> 
     </route> 

問題是這些文件可能相當大。可以說1Gb。爲了將該文件複製到傳入的文件夾中,可能需要10秒鐘。在這10秒內,消費者輪詢該目錄,並且由於部分文件仍在被複制,所以拋出異常。我可以使用哪種解決方法?

我用readLock所有戰略(主要是改變了),但我得到一個異常:

(The process cannot access the file because it is being used by another process) 

修改後的URI如下:

<from uri="file://my/file/path?readLockCheckInterval=3000&amp;readLock=changed"/> 

仍然沒有運氣雖然

+0

您的異常應該處理。例外是說它不能讀取文件。通過處理例外,您可以例如停止路線,暫停,發送電子郵件,發送推文以支持或正確處理。不使用這些選項時,您沒有收到正確的異常? – Namphibian 2014-09-01 02:12:40

+0

我面臨同樣的問題並尋找解決方案。 [latest documentation](http://camel.apache.org/file2.html)提到'changed ... readLockCheckInterval ...這個選項僅適用於Camel 2.8以後的FTP組件。不確定已更改或readLockCheckInterval或兩者僅適用於FTP。 – ren78min 2015-09-06 20:14:16

回答

5

檢查readLock選項File component

由消費者使用,只在文件具有獨佔讀鎖定時才輪詢文件。該文件不在進行中或正在寫入)。駱駝將等待,直到授予文件鎖定。

此選項提供了策略構建:

markerFile駱駝創建一個標記文件(fileName.camelLock),然後在其持有的鎖。

changed正在使用文件長度/修改時間戳來檢測當前是否正在複製文件。至少會使用1秒。爲了確定這一點,所以這個選項不能像其他進程一樣使用文件,但可以更可靠,因爲JDK IO API不能總是確定文件當前是否正在被另一個進程使用。 readLockCheckInterval選項可用於設置檢查頻率。

fileLock用於使用java.nio.channels.FileLock。在通過mount/share訪問遠程文件系統時,應避免使用此方法,除非該文件系統支持分佈式文件鎖定。

重命名是用於嘗試重命名該文件作爲測試,如果我們可以獲得獨佔的讀鎖定。

+0

我試過所有這些策略,但沒有任何運氣。請檢查更新並查看我正在使用的URI。 – ChrisGeo 2014-08-28 19:40:06

1

readLock =更改選項在這種情況下似乎是合適的。如果生產者將文件寫入傳入文件夾的速度非常慢,則可能會出現問題。

其他選項是使用完成的文件名。文件寫入完成後,您可以讓原始製作人員創建完成的文件。

其更常見的是每個目標文件具有一個完成的文件。這意味着有 1:1的相關性。爲此,您必須在 doneFileName選項中使用動態佔位符。目前Camel支持以下兩個動態令牌: :file:name和file:name。noext必須在$ {}中包含 。消費者僅支持已完成文件名稱的靜態部分作爲前綴或後綴(不是兩者)。

from(「file:bar?doneFileName = $ {file:name} .done」);
在此示例中,如果存在具有名稱文件 name.done的完成文件,則將僅查詢文件。

1

這樣的事情可以解決。如果它的NON-Camel系統正在將您的大文件複製到InputDir中,那麼在複製文件之後,您必須小心創建.DONE文件。一旦.DONE文件可用,路由將開始處理。

from("file://" + InputDir + "?delay=500&doneFileName=${file:name}.DONE") 
    .to("file://" + OutputDir + "?fileName=${date:now:yyyyMMdd}/${file:name}&doneFileName=${file:name}.DATA.READY.DONE"); 
相關問題