【问题标题】:How can I include common behavior in several Apache Camel routes?如何在多个 Apache Camel 路由中包含常见行为?
【发布时间】:2018-10-20 21:12:53
【问题描述】:

我在 Spring Boot 1.5.8 应用程序中使用 Camel 2.19.2。例如,如果我想让我的几条路线“状态感知”,我该如何实现呢?我所说的“状态感知”是指路由将启动,通知组件工作流已经开始,然后它将执行特定于路由的逻辑,当完成时,它会通知组件工作流已经完成。如果可能的话,我希望这种情况自动发生,并且不必在我想使用此功能的每个路由构建器中调用特定逻辑。

这是一个代码示例,就像我的意思:

public class FooRouteBuilder extends StatusAwareRouteBuilder {
    @Override
    public void configure() {
        // Here I want to have this route know how to notify something
        // that this processing has begun, but I do not want to have
        // to explicitly call a processor to make it happen, but it
        // should know what to do by virtue of extending a custom
        // route builder, if appropriate, or by some other/better
        // mechanism

        // Now conduct any route-specific logic
        from("vm:myAction")
            .process("myProcessor");

        // Now handle the status notification that this is finished...
        // Here I want to have this route know how to notify something
        // that this processing has finished
    }
}

从概念上讲,这几乎就像 AOP,所以我希望能够在一个地方定义此行为并将其包含在需要使用此行为的一些路由中。有没有办法可以做到这一点?我看到有用于测试的adviceWith,但我需要这个用于常规操作。提前致谢。

【问题讨论】:

    标签: apache-camel spring-camel


    【解决方案1】:

    我认为 RoutePolicy 和 RoutePolicyFactory 可以作为答案,即您可以在路由或交换启动/停止时调用回调。

    欲了解更多信息,请参阅http://camel.apache.org/routepolicy.html

    【讨论】:

    • 我需要在每次调用路由时(当消息传递给它时)发生它,而不仅仅是在路由开始/停止时。
    • 所以看看 onExchangeBegin / onExchangeDone
    【解决方案2】:

    也许Camel interceptors 可以帮助你。这些通常是小型适用于所有或大部分路由的通用路由

    例如在每条路线上进行安全检查。使用拦截器只需编写一次,它就会应用于所有路由,甚至是添加的新路由。

    共有三种口味。

    • intercept 在路由时拦截每个处理步骤 路由中的交换。
    • interceptFrom 拦截每个传入 路线中的交换(处理开始)
    • interceptSendToEndpoint 拦截时 Exchange 即将发送到端点。

    可以将拦截器配置为仅针对特定端点类型“触发”,或者在其他特定条件下由Camel predicate 配置。

    还有onCompletion feature 在路线完成时做类似的事情。在失败完成或两者都成功完成时(默认)。

    【讨论】:

    • 这个解决方案让我很感兴趣,但我只希望拦截发生在指定路线上,并且只在路线开始时发生,然后在路线完成时再次发生(不管正常完成还是异常) .我无法从该文档中判断这是否可能。
    • 我已经扩展了我的答案。路线起点:interceptFrom;路线完成:onCompletion。仅限某些路由:使用 Predicate 来定义拦截器应用到的路由。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多