Apache camel 骆驼:如何走完所有的路;什么时候;在;选择“何时”;

Apache camel 骆驼:如何走完所有的路;什么时候;在;选择“何时”;,apache-camel,content-based-retrieval,Apache Camel,Content Based Retrieval,我需要问一个关于Apache Camel route中操作员“选择时间”的问题。在下面的示例中,如果我有两个soap env:Order元素,它们的值为1,2,那么我想创建两个名为output_1.xml和output_2.xml的xml文件。但是,代码只能创建一个文件output_1.xml。 有人能给我一些想法或提示吗?谢谢你的帮助 public void configure() { ... from("direct:a") .choice()

我需要问一个关于Apache Camel route中操作员“选择时间”的问题。在下面的示例中,如果我有两个soap env:Order元素,它们的值为1,2,那么我想创建两个名为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")
}

我的理解是,基于内容的路由器实现了“if-else if-else”语义,这意味着一旦一个测试的结果为true,其余的测试就会被跳过。如果要为每个返回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()

我的理解是,基于内容的路由器实现了“if-else if-else”语义,这意味着一旦一个测试的结果为true,其余的测试就会被跳过。如果要为每个返回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()

DSL没有问题,您不需要在这里使用端块。我会查看您的数据并跟踪为什么所有调用都在同一个when块中结束。在跟踪程序中放几行日志,或者启用跟踪程序,然后查看正在进行的交换

DSL没有问题,这里不需要终端块。我会查看您的数据并跟踪为什么所有调用都在同一个when块中结束。在跟踪程序中放几行日志,或者启用跟踪程序,然后查看正在进行的交换

在Camel root choice()中,如果有多个when()案例,则必须以其他方式编写()。请参阅下文

 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;
上述解决方案将检查所有三个条件,即使第一次通过。

在Camel root choice()中,如果有多个when()案例,则必须编写其他()。请参阅下文

 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;

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

也许
.choice()
块需要
.end()
也?@vikingsteve不知道。我对JavaDSL不是很熟悉。的文档页未显示它。如果你能确认它是必需的,我当然会更新答案。谢谢拉尔夫和维金斯蒂夫,问题由你的答案解决了。也许
.choice()
块需要
.end()
也?@vikingsteve不知道。我对JavaDSL不是很熟悉。的文档页未显示它。如果您能确认这是必需的,我当然会更新答案。感谢Ralf和VikkingSteve,您的答案解决了这个问题。其他选项是使用Splitter,对于每个Soapenv呼叫,直接:a.Hi Leo,我使用Splitter,问题是我的输入文件根据标准被拆分为多条消息,但是我想要一个完整的文件,这样我就可以创建一个新的输出文件。另一个选项是使用Splitter,对于每个Soapenv调用direct:a.Hi Leo,我使用了Splitter,问题是我的输入文件根据条件被拆分为多个消息,但是我想要一个完整的文件,这样我就可以创建一个新的输出文件。