2012-09-24 114 views
2

我想讀取一個ftp目錄中的所有文本文件,解析它們。如果解析成功,然後將它們移動到不同的目錄(不是默認的目錄,即.done目錄),如果解析失敗,則文件應保留在ftp目錄中。這個概念看起來很簡單,但是我的路由只從ftp讀取一個文件,而路由在讀取一個文件後自行結束。Apache Camel | FTP |只消費單個文件

以下是代碼:

@Override 
    public void configure() throws Exception { 

     from(EndPointConstants.DIRECT + GetDriverProductInfo.class.getSimpleName()) 
     .pollEnrich(ftp://[email protected]/fantics?password=******&recursive=true) 
     .to("file://test/readFile") 

有什麼事情關係到pollEnrich其只能得到一個單一的文件,進程不發生遞歸?

回答

2

如果解析成功,然後將其移動到不同的目錄(不是默認的,即.done目錄)

使用這樣的例子:

.to("file://test/readFile?autoCreate=true&moveFailed=.failed/${date:now:yyyyMMdd}/${file:name}&move=.processed/${date:now:dd-MM-yyyy}/${file:name}") 

從駱駝文檔(FTP/SFTP/FTPS Component):

FTP使用者將默認保留t他在遠程FTP服務器上消耗了文件。如果您希望刪除文件或將其移動到其他位置,則必須明確地進行配置。例如,您可以使用delete = true來刪除文件,或使用move = .done將文件移動到隱藏的完成子目錄中。 常規文件使用者不同,因爲默認情況下會將文件移動到.camel子目錄。 Camel對FTP使用者默認不這樣做的原因是默認情況下它可能缺少權限來移動或刪除文件。

所以你可以使用例如:

&noop=false 

&move 

&delete=false 

編輯:

我想你應該拿出這樣的(下面的代碼)爲pollEnrich()不這個案件的套件。

(以下代碼是高度泄氣被使用,因爲它是而不是使用的一個例子)

from("direct:scan") 
    .process(new Processor() 
    { 
     public void process(Exchange exchange) throws Exception 
     { 
      ConsumerTemplate consumerTemplate = exchange.getContext().createConsumerTemplate(); 
      ProducerTemplate producerTemplate = exchange.getContext().createProducerTemplate(); 
      producerTemplate.setDefaultEndpointUri("file:.."); 
      producerTemplate.send(consumerTemplate.receive("ftp:..")); 
     } 
    }); 

乾杯!

+0

感謝您的決議,但問題是別的。我希望FTP文件夾中的所有文件都由單一路由消耗。目前上面的代碼只是獲取一個文件並停止路由。我想從FTP獲取所有文件,然後遍歷路由中的文件列表。任何幫助,將不勝感激。 – piyushGoyal

+0

然後你應該從ftp使用,例如從(ftp)開始,然後輪詢所有的文件。 pollEnrich用於輪詢*單個*消息。正如@ClausIbsen所說的 –

+0

。您可能想要使用.from(..)並添加聚合策略http://camel.apache.org/aggregator.html。還有一個ftp選項可以遍歷ftp目錄。 –