2014-01-07 83 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)时,捕获一些异常可能是必要的;)。