Apache camel 骆驼:如何走完所有的路;什么时候;在;选择“何时”;
我需要问一个关于Apache Camel route中操作员“选择时间”的问题。在下面的示例中,如果我有两个soap env:Order元素,它们的值为1,2,那么我想创建两个名为output_1.xml和output_2.xml的xml文件。但是,代码只能创建一个文件output_1.xml。 有人能给我一些想法或提示吗?谢谢你的帮助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()
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,问题是我的输入文件根据条件被拆分为多个消息,但是我想要一个完整的文件,这样我就可以创建一个新的输出文件。