我可以选择多种选项,但该路线仅适用于最后一种情况。对于其他条件,路线被卡住并且不会继续进行。
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");
}
}
执行时,日志"唯一的最终条件到达此处"打印最终条件。当条件重新排序时,它也会打印最后一个条件。
我认为这是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>
答案 0 :(得分:4)
在您的示例中,when
条件似乎正确评估,但是测试“one”和“two”缺少最终的日志语句。
使用.end()
代替.endCoice()
:
.endChoice()
返回“基于内容的路由器”,即如果代码块不是简单的语句,请使用.endChoice()
结束when
条件,请参阅here了解有关此问题的详细信息。 .end()
结束整个choice
阻止。答案 1 :(得分:0)
您正在比较可能与类类型相关的字符串,并且始终不匹配。
您可以使用这些枚举类的字符串值,所以它的
${header.foo} == 'FOO'
只有当标头是实际的枚举类类型时,==
比较器才有效。但也许我们可以改进Camel以检测您是否与枚举类型进行比较并尝试先前的类型转换。我已经记录了一张票:https://issues.apache.org/jira/browse/CAMEL-8485