1

I need to ask a problem on the operator "choice when" in Apache Camel route. In the following example, if I have two soap-env:Order elements which have 1, 2 value, then I want to create two xml file named output_1.xml and output_2.xml. However, the code can only create one file output_1.xml. Can anyone give me any ideas or hints? Thanks for any help.

    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")
}
4

3 回答 3

6

我的理解是基于内容的路由器实现了“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()
于 2014-01-07T07:11:55.520 回答
0

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

于 2014-01-07T20:28:49.723 回答
-1

在 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;

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

于 2018-11-16T03:56:58.080 回答