Camel advice在更改编织语句的顺序时表现不同

时间:2017-02-02 10:48:57

标签: apache-camel

我有以下用于演示目的的路线

from("direct:external")
    .routeId("external")
    .to("http4://www.third-party.com/foo").id("ext");

为了测试,我想 *用direct:端点替换http4:端点 *在路线末尾添加一个模拟:端点进行验证

我添加了以下adviceWithRouteBuilder

context.getRouteDefinition("external").adviceWith(context, new AdviceWithRouteBuilder() {
    @Override
    public void configure() throws Exception {
        weaveAddLast().to("mock:result");
        weaveByToUri(".*http4://.*")
            .replace()
            .to("direct:foo");
    }
});

这个似乎有用,但是如果我改变weave*语句的顺序,就像这样

public void configure() throws Exception {
    weaveByToUri(".*http4://.*")
        .replace()
        .to("direct:foo");
    weaveAddLast().to("mock:result");
}

它给我以下错误

  

java.lang.IllegalArgumentException:没有匹配的输出:*在路线中:路线(外部)[[从[直接:外部]] - > [管道 - > [[至[直接:FOO]]]]]

我实际上希望得到相同的结果,与订单无关。

1 个答案:

答案 0 :(得分:6)

这里要注意的一点是numpy调用只知道原始的RouteBuilder。因此,当您首先执行weave*调用时,它会将weaveByUri()替换为.to("http4://www.third-party.com/foo"),这恰好是您路线中的最后一个终点。现在,当您执行.to("direct:foo")调用时,它会查找weaveAddLast()但找不到它,因为它已被"http4://www.third-party.com/foo"替换。这导致抛出异常。

因此,假设在"direct:foo"端点之后还有另一个端点,使其不再是您路由中的最后一个端点,那么"http4..."应该可以正常工作。例如,如果您的原始路线看起来像这样,它将起作用:

adviceWith()

我应该注意到,我认为这是一个错误,订单无关紧要。