2014-01-07 82 views
1

下面列出的代碼工作得很好,但它的功能是查看XML文件,如果該字段是'我們'將其移動到另一個目錄;我想知道如何使用.choice()函數:Apache-Camel Choice on Filetype

1)如何指定要路由的特定文件? (將文件名添加到路徑末尾不起作用)

2)如何指定要路由的文件類型? (例如:將所有.txt文件路由到「blah」)

3)除了使用.choice之外,還有其他選項可以幫助我做到這一點嗎?

CamelContext context = new DefaultCamelContext(); 
    context.addRoutes(new RouteBuilder() 
    { 
     public void configure() throws Exception 
     { 
      from("file:C:\\camels\\inner?delete=true") 
       .choice() 
        .when(xpath("/author/country = 'us'")) 
         .to("file:C:\\testing"); 
     } 
    }); 
    context.start(); 
    Thread.sleep(10000); 
    context.stop(); 

回答

2

這裏有一些方法可以做到這

  • 看一看http://camel.apache.org/file-language.html由駱駝暴露文件語言中,這提供了一些選項,你可以用它來獲得文件名以擴展名,文件只有名字,文件父文件擴展名等。

  • 也看一下包括選項在http://camel.apache.org/file2.html,這將有助於查詢出與文件名匹配正則表達式模式只有文件。

    from("file:C:\\camels\\inner?delete=true&include=abc") 
    
  • 建立一個謂語,並用它象下面這樣:

    CamelContext context = new DefaultCamelContext(); 
    context.addRoutes(new RouteBuilder() 
    { 
        Predicate predicate = PredicateBuilder.and(simple("${file:name.ext} == 'txt'"), XPathBuilder.xpath("/author/country = 'us'")); 
        public void configure() throws Exception 
        { 
         from("file:C:\\camels\\inner?delete=true") 
          .choice() 
           .when(predicate) 
            .to("file:C:\\testing"); 
        } 
    }); 
    context.start(); 
    Thread.sleep(10000); 
    context.stop(); 
    
+0

感謝您的幫助和資源!太棒了。 –

+1

謂詞中存在拼寫錯誤。我不得不把它寫成...簡單(「$ {file:name.ext} =='txt'」)以供我的案例使用。但這是一個簡單的解決方法,謝謝其他人。我無法圍繞Predicate實例化和所有可用的語言進行包裝,這非常有幫助。 –

+0

你可以upvote這個問題,如果它幫助你:) –

0

回答你的問題的前兩點:這是可能的 - 看看documentation。名爲fileName的參數在那裏有很好的描述,它允許您非常嚴格地控制文件名和擴展名(實際上是名稱的一部分)。

當談到第3點,那麼如果你的「選擇」只有一個案例,那麼我想推薦使用過濾器component rather然後選擇。

它將允許您輕鬆建模路由,例如* xml路由到您的「測試」目錄,當它確實是XML並且包含國家「我們」時。請注意,當出現錯誤的文件(非XML)時,捕獲一些異常可能是必要的;)。