2014-04-03 93 views
0

我正在使用駱駝路由(R)將文件從A複製到B.但是這是基於事件的,即有路由R1輪詢目錄(C),並且當找到任何文件時,其處理器觸發R複製文件,然後暫停R.駱駝暫停策略

我想確保,暫停A中的所有現有文件複製到B,然後只有我會暫停。但是,任何關機策略(不知道這是否在暫停時也是如此)確保只有待處理消息被處理,即只有當前文件(當前R正在處理的文件)將在R暫停之前被複制到B.但我想要全部存在文件必須複製到B.

我該如何確保。

約束:

  1. 路線R必須是基於事件的,當只有一個事件來那麼只有它會複製從A到B現有的日誌文件,那麼它會進入休眠狀態,直到下一個事件來
  2. 如果R是基於事件的,並且由於A是所有日誌所在日誌文件夾,所以我無法每次都複製所有日誌...巨大的尺寸
  3. 複製後無法從A中刪除文件

Tha nks, Abhishek

+0

你爲什麼需要R1?你可以不使用一個單一的路徑R來監視C的「準備文件」,然後只複製從A到B的所有內容嗎?我假設「等待準備好文件」是爲什麼你想暫停R? – Ralf

回答

0

這是一個問題嗎?

由於在路徑中有一個OnCompletion,用於統計文件夾中消息的數量,並且如果沒有文件,請關閉路由。

+0

onCompletion被稱爲每條消息。我想要一個將在所有消息完成時調用的鉤子(按照路徑開始時間快照) –

+0

定義「全部」。路由中的消息處理是連續操作,而不是謹慎的批處理操作。它會在目錄出現時從目錄中抓取文件。所以,因爲我猜你認爲一個空白的源文件夾等於「所有消息都已完成」,所以每次消息完成後可以進行一次簡單的檢查,並確定是否是最後一次。 –

+0

我同意你的看法......我想在所有日誌被複制時關閉路由。直到它很好。我如何檢測一個文件夾是空的...我的意思是,如果我在我自己的邏輯上做,它不會與駱駝的邏輯類似,以跟蹤哪些文件已被複制。我可能會在A目錄中看到一個文件,因此對於我來說這不是空的,而且路由尚未完成。但可能是,駱駝已經複製了文件,所以從它的角度來看它是一個空文件夾。無論如何要從駱駝得到這些信息嗎? –

1

有時,使用我們在「前駱駝」時代中使用的古老Java堆棧會更容易。這就是說,做你自己的文件複製在單獨Processor(或駱駝還沒有意識豆):

@Override 
public void process(final Exchange exchange) throws Exception { 
    final File source = new File("/path/to/in-directory"); 
    final File desc = new File("/path/to/out-directory"); 
    org.apache.commons.io.FileUtils.copyDirectory(source, desc); 
} 

對於文件的副本,該org.apache.commons.io.FileUtils從Apache Commons項目使用。

編輯:

由於@Petter正確地指出,這種解決方案,也沒有必要創建和啓動具有再次被關閉一個獨立的路線。目錄拷貝處理器可以被添加到觸發拷貝的R1處理器中。

+1

好主意。這項工作的正確工具。然而,不知道這裏駱駝東西增加了什麼價值。 copyDirectory調用可能就足夠了。 :) –

+0

@Petter你是絕對正確的,在這種情況下,沒有必要創建一個單獨的路線。文件複製處理器可以嵌入到'R1'路由中。 –

+0

@Peter:我已經添加了幾個必須滿足的約束,同時解決這個問題 –