【问题标题】:Apache Camel Issue having routingSlip after a filterApache Camel 问题在过滤器后出现 routingSlip
【发布时间】:2021-07-28 06:22:34
【问题描述】:

我正在实现一个 Camel 路由,我需要在其中放置一个过滤器,然后再将消息处理重定向到一个端点或另一个取决于 routing slip 标头的端点。如下所示:

        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 构造就可以了。

提前感谢您的意见。

【问题讨论】:

    标签: java apache-camel


    【解决方案1】:

    尝试在.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 与if 基本相同,没有else,所以你可以在其中添加一堆路由逻辑。我使用它的一种常见方法是在数据库查询结果包含 0 个条目或 REST-API 请求缺少必需参数或其他情况等情况下提前退出路由。
    【解决方案2】:

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

    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

    【讨论】:

    • 在这种情况下,简单的替代方法是使用 and from compound predicates (import static org.apache.camel.builder.PredicateBuilder.and)。
    • 这不起作用,因为如果 body 为空,它将最终执行 otherwise 分支,这不是我想要的。对我的问题并不重要,但 ${header.foo} != null 也不正确,因为 foo 是一个布尔值。应该只是${header.foo}
    猜你喜欢
    • 2017-05-09
    • 2013-12-17
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 2011-07-12
    相关资源
    最近更新 更多