具有选择的Camel Java DSL路由仅针对最后条件进行

时间:2015-03-14 01:49:28

标签: java apache-camel

我可以选择多种选项,但该路线仅适用于最后一种情况。对于其他条件,路线被卡住并且不会继续进行。

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>

2 个答案:

答案 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