Camel Java DSL Route with Choice 仅针对最后一个条件进行
Camel Java DSL Route with Choice proceeds only for last condition
我有很多选择,但路线只适用于最后一个条件。对于其他情况,路线被卡住,不会继续前进。
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");
}
}
执行时,将打印日志 "only final condition reaches here" 作为最终条件。当条件也重新排序时,它正在打印最后一个条件。
我认为这是 Java DSL 的问题。当我在 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>
您正在比较一个可能与 class 类型的字符串,但它总是不匹配。
您可以使用这些枚举的字符串值 classes,所以它
${header.foo} == 'FOO'
只有当 header 是一个实际的枚举 class 类型时,==
比较器才会起作用。但也许我们可以改进 Camel 以检测您正在与枚举类型进行比较并尝试先进行类型转换。我已经记录了一张票:https://issues.apache.org/jira/browse/CAMEL-8485
在您的示例中,when
条件似乎评估正确,但缺少测试 "one" 和 "two" 的最终日志语句。
使用.end()
代替.endCoice()
:
- 使用
.endChoice()
以便 return "back" 到基于内容的路由器,即,使用 .endChoice()
结束 when
条件,如果代码block 不是一个简单的语句,有关此问题的更多信息,请参阅 here。
- 使用
.end()
来结束整个choice
块。
我有很多选择,但路线只适用于最后一个条件。对于其他情况,路线被卡住,不会继续前进。
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");
}
}
执行时,将打印日志 "only final condition reaches here" 作为最终条件。当条件也重新排序时,它正在打印最后一个条件。
我认为这是 Java DSL 的问题。当我在 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>
您正在比较一个可能与 class 类型的字符串,但它总是不匹配。
您可以使用这些枚举的字符串值 classes,所以它
${header.foo} == 'FOO'
只有当 header 是一个实际的枚举 class 类型时,==
比较器才会起作用。但也许我们可以改进 Camel 以检测您正在与枚举类型进行比较并尝试先进行类型转换。我已经记录了一张票:https://issues.apache.org/jira/browse/CAMEL-8485
在您的示例中,when
条件似乎评估正确,但缺少测试 "one" 和 "two" 的最终日志语句。
使用.end()
代替.endCoice()
:
- 使用
.endChoice()
以便 return "back" 到基于内容的路由器,即,使用.endChoice()
结束when
条件,如果代码block 不是一个简单的语句,有关此问题的更多信息,请参阅 here。 - 使用
.end()
来结束整个choice
块。