如何在多个 Apache Camel 路由中包含常见行为?

How can I include common behavior in several Apache Camel routes?

我在 Spring Boot 1.5.8 应用程序中使用 Camel 2.19.2。例如,如果我想让我的几条路线成为 "status aware",我该如何实现? "status aware" 的意思是路由会启动,通知一个组件工作流已经开始,然后它会执行特定于路由的逻辑,当它完成时,它会通知一个组件工作流已经完成.如果可能的话,我希望这会自动发生,而不必在我想使用此功能的每个路由构建器中调用特定逻辑。

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

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,但我需要它来进行常规操作。提前致谢。

我认为 RoutePolicy 和 RoutePolicyFactory 可能是答案,即您可以在路由或交换时调用回调 start/stop。

有关详细信息,请参阅 http://camel.apache.org/routepolicy.html

也许Camel interceptors可以帮到你。这些通常是小型 通用路线,适用于您的全部或大部分路线

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

共有三种口味。

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

拦截器可以配置为 "fire" 仅针对特定端点类型或 Camel predicate 在其他特定条件下。

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