驼峰Java DSL路由选择仅在最后一个条件下进行
我有很多选择,但路线只适用于最后一个条件。在其他情况下,路线被卡住,无法继续行驶驼峰Java DSL路由选择仅在最后一个条件下进行,java,apache-camel,Java,Apache Camel,我有很多选择,但路线只适用于最后一个条件。在其他情况下,路线被卡住,无法继续行驶 public class CamelChoiceTest { private CamelContext context; @Before public void initializeContext() throws Exception { RouteBuilder builder = new RouteBuilder() { public void configure() {
public class CamelChoiceTest {
private CamelContext context;
@Before
public void initializeContext() throws Exception {
RouteBuilder builder = new RouteBuilder() {
public void configure() {
from("direct:test")
.choice()
.when(header("number").isEqualTo("one")).to("direct:one")
.when(header("number").isEqualTo("two")).to("direct:two")
.when(header("number").isEqualTo("three")).to("direct:three")
.endChoice()
.log("only final condition reaches here");
from("direct:one").log("one is selected");
from("direct:two").log("two is selected");
from("direct:three").log("three is selected");
}
};
context = new DefaultCamelContext();
context.addRoutes(builder);
context.setTracing(true);
context.start();
}
private void send(String header){
Exchange exchange = new DefaultExchange(context);
exchange.getIn().setHeader("number", header);
exchange.getIn().setBody("test", String.class);
ProducerTemplate producerTemplate = context.createProducerTemplate();
// Send the request
producerTemplate.send("direct:test", exchange);
}
@Test
public void testOne() throws Exception {
send("one");
}
@Test
public void testTwo() throws Exception {
send("two");
}
@Test
public void testThree() throws Exception {
send("three");
}
}
执行时,将打印最终条件日志“仅最终条件到达此处”。当条件也重新排序时,它将打印最后一个条件
我认为这是JavaDSL的一个问题。当我在XML中创建了同样的代码时,它工作得很好
<camel:camelContext id="testCamelContext" trace="true"
streamCache="true">
<camel:route>
<camel:from uri="direct:test" />
<camel:choice>
<camel:when>
<camel:simple>${header.number} == 'one'</camel:simple>
<camel:to uri="direct:one" />
</camel:when>
<camel:when>
<camel:simple>${header.number} == 'two'</camel:simple>
<camel:to uri="direct:two" />
</camel:when>
<camel:when>
<camel:simple>${header.number} == 'three'</camel:simple>
<camel:to uri="direct:three" />
</camel:when>
</camel:choice>
<camel:to uri="bean:routeBean?method=receive" />
</camel:route>
</camel:camelContext>
${header.number}=='one'
${header.number}=='2'
${header.number}==“三”
您正在比较一个字符串可能与一个类类型,而这总是不匹配的
您可以使用这些枚举类的字符串值,因此
${header.foo} == 'FOO'
只有当标头是实际的枚举类类型时,
=
比较器才会工作。但也许我们可以改进Camel,以检测您正在与枚举类型进行比较,并在之前尝试类型转换。我已经记录了一个问题:在您的示例中,当条件似乎正确评估时,,但是测试“1”和“2”缺少最终日志语句
使用.end()
代替.endCoice()
:
- 使用
.endChoice()
将“返回”到基于内容的路由器,即使用.endChoice()
在
条件时结束如果代码块不是简单语句,请参阅以了解有关此问题的更多信息李>
使用.end()
结束整个选项
块
不确定人们是否能理解您的问题所在is@ClausIbsen我已经更新了问题,请看一看实际上问题不在Enum上。我也试过用string,同样的问题。问题在于JavaDSL,它在XML中运行良好。我已经更新了问题,请检查。是的,这是正确的,endChoice返回到CBR,end()完全结束CBR。我正在改进JavaDSL来检测这个无效的路由,并抛出一个异常来解释如何使用end