2012-09-25 73 views
0

我寫了一個駝峯(2.10)組件做Sftp,因爲我需要更多的控制連接比開箱即用的組件。持有Sftp連接打開駱駝組件內部和路由

我有路由看起來是這樣的:

from("direct:start") 
    .to(startProcessor())  //1. Start processor sets the connection parameters for myCustomSftpComp producer 
    .to("myCustomSftpComp")  //2. Uses Jsch, connects to server, gets the file, add to exchange, closes connection 
    .to(somePostProcessor()) //3. Does something with the file 
    .to("file://....");   //4. Write the file 

這一切都工作得很好。

我的問題是在第2步,此刻我的文件非常小,我將它們緩衝到內存中,將字節數組添加到Exchange主體並將其傳遞並處理,直到它被文件端點寫入。

當然,這不會是可持續的一個大文件,我需要添加InputStream引用到交換。我的問題是我關閉並清理到myCustomSftpComp內的服務器的連接,因此當交換機到達後處理器和文件端點時,將無法再訪問它。

所以基本上我需要一些方法來保持連接打開,直到文件被寫入並關閉組件內的服務器連接從路由定義中,聽起來不整潔,所以我打開這樣做的自由方式。

+0

它是一個要求每次關閉連接,例如在路線的終點?如果您打開連接,則步驟2將重新使用以前的連接(如果它仍然連接)。所以你可以設置disconnect = false。 –

+0

@Claus - 目標服務器上的資源使用是一個問題,所以我需要確保連接正確清理,因此當前實現。如果我在步驟2中斷開連接,有什麼方法確保在路線完成其工作後,即在步驟3或4之後關閉它? – tja

+0

您需要擴展駱駝ftp組件(例如生產者),並在會話完成時將會話關閉邏輯移動到交換機上,例如我認爲我們在郵件組件中執行的操作有點類似於檢查郵件使用者。然後,當交換完成時,例如在第4步之後,將執行該邏輯。 –

回答

0

我不確定爲什麼自己編寫了自己的SFTP組件,因爲常規FTP組件可以處理SFTP。

如果您要在第三步中執行一些處理,僅傳遞輸入流仍然會傳遞內存中的內容。特別是,這將是一個問題,因爲InputStream只能被讀取一次(儘管可以啓用StreamCaching,但會消耗內存)。

FTP組件可以做的是將文件本地下載到磁盤上的臨時文件。然後將文件句柄傳遞給它。從那一個,你可以很容易地讓Streams做它的事情,並且一旦完成就將它寫入一個新文件。

檢查了這一點: http://camel.apache.org/ftp2.html#FTP2-UsingLocalWorkDirectory

+0

爲此創建自定義組件並不是一種天真的選擇,我爲我的用例廣泛測試了FTP/SFTP組件,發現它們太慢(主要是由於我正在處理的文件和輪詢使用者的大量文件),其次,正如我在文章中所說的,我需要對連接進行絕對控制,因爲我的組件還內置了一些負載平衡策略。我將再次使用本地工作目錄進行調查,看看它是否適合解決方案。 – tja

+0

當然,我確定有理由。正如你所說,SFTP/FTP的行爲從用例到用例都有很大的不同。 無論如何,克勞斯回答關於移動會話處理到交換的生命週期似乎是要走的路 –