Apache Camel 问题在过滤器后有 routingSlip

Apache Camel Issue having routingSlip after a filter

我正在实现一个 Camel 路由,我需要在将消息处理重定向到一个端点或另一个端点之前放置一个过滤器,具体取决于 routing slip header。如下所示:

        from("direct:a")
            .routeId("a")
            .choice()
                .when(header("foo"))
                    .filter(body().isNotNull())
                    .routingSlip(header("my-slip"))
                .endChoice()
                .otherwise()
                    .log("header 'foo' was false")
                .endChoice()
            .end();

尝试 运行 应用程序时出现以下异常:

java.lang.ClassCastException: class org.apache.camel.model.FilterDefinition cannot be cast to class org.apache.camel.model.ChoiceDefinition

任何解释为什么这不是一个合法的结构,以及我应该如何编写我的路线来实现我想要的。根据我自己的观察,造成这种情况的是 choice() 结构。如果没有选择,在 filter 之后添加 routingSlip 构造就可以了。

提前感谢您的意见。

尝试在 .routingSlip(header("my-slip")) 之后添加 .end() 以关闭过滤器定义。

 from("direct:a")
.routeId("a")
.choice()
    .when(header("foo"))
        .filter(body().isNotNull())
            .routingSlip(header("my-slip"))
        .end()
    .endChoice()
    .otherwise()
        .log("header 'foo' was false")
    .endChoice()
.end();

只需删除 filter。将所有条件放在 when 分支中。 例如,这里我使用的是简单语言:

from("direct:a")
.routeId("a")
.choice()
    .when(simple("${header.foo} !=null and ${body}!=null))
        .routingSlip(header("my-slip"))
    .endChoice()
    .otherwise()
        .log("header 'foo' was false")
    .endChoice()
.end();

filterchoice是相似的。您可以使用 filter 而不是单个 if (或者也可以从列表中过滤项目);在 if .. else.

的情况下使用 choice