【问题标题】:Camel: How to go all "when" in "choice when"骆驼:如何在“选择何时”中完成所有“何时”
【发布时间】:2014-01-07 02:59:25
【问题描述】:

我需要问一个关于 Apache Camel 路由中运算符“选择何时”的问题。在以下示例中,如果我有两个具有 1、2 值的 soap-env:Order 元素,那么我想创建两个名为 output_1.xml 和 output_2.xml 的 xml 文件。但是,代码只能创建一个文件 output_1.xml。 谁能给我任何想法或提示?感谢您的帮助。

    public void configure() {
    ...  
    from("direct:a")
        .choice()
            .when(ns.xpath("//soap-env:Envelope//soap-env:Order='1'"))
                .to("file://data?fileName=output_1.xml")
            .when(ns.xpath("//soap-env:Envelope//soap-env:Order='2'"))
                .to("file://data?fileName=output_2.xml")
            .when(ns.xpath("//soap-env:Envelope//soap-env:Order='3'"))
                .to("file://data?fileName=output_3.xml")
}

【问题讨论】:

  • 其他选项是使用 Splitter 并为每个 Soapenv 直接调用:a。
  • 嗨,Leo,我使用了 Splitter,问题是我的输入文件根据条件分成了几条消息,但我想要一个完整的文件,以便我可以创建一个新的输出文件。

标签: apache-camel content-based-retrieval


【解决方案1】:

我的理解是基于内容的路由器实现了“if - else if - else”语义,这意味着一旦一个测试评估为真,那么剩余的测试就会被跳过。如果您想为每个返回 true 的案例创建文件,那么您必须将路由更改为如下所示:

from("direct:a")
    .choice()
       .when(ns.xpath("//soap-env:Envelope//soap-env:Order='1'"))
           .to("file://data?fileName=output_1.xml")
    .end()
    .choice()
       .when(ns.xpath("//soap-env:Envelope//soap-env:Order='2'"))
           .to("file://data?fileName=output_2.xml")
    .end()
    .choice()
        .when(ns.xpath("//soap-env:Envelope//soap-env:Order='3'"))
           .to("file://data?fileName=output_3.xml")
    .end()

【讨论】:

  • 也许.choice() 块也需要.end()
  • @vikingsteve 不知道。我对 Java DSL 不是很熟悉。 content based router 的文档页面没有显示它。如果您可以确认它是必需的,我当然会更新答案。
  • 感谢 Ralf 和 VikkingSteve,您的回答解决了问题。
【解决方案2】:

DSL 没有任何问题,您在这里不需要结束块。我会查看您的数据并跟踪为什么所有调用都以相同的方式结束。放入几行日志或启用跟踪器并查看正在进行的交换。

【讨论】:

    【解决方案3】:

    在 Camel rootchoice() 中,如果您有多个 when() 情况,则必须编写 else()。请参考下文。

     from("direct:a")
              .choice()
                  .when(header("foo").isEqualTo("bar"))
                       .to("direct:b")
                  .when(header("foo").isEqualTo("cheese"))
                       .to("direct:c")
                  .otherwise()
                       .to("direct:d")
             .end;
    

    即使第一个通过,上述解决方案也会检查所有三个条件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多