架构

路由策略

师成师成· 更新于 2026-09-28· 阅读 13 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

RoutePolicy

路由策略 org.apache.camel.spi.RoutePolicy 用于在运行时控制路由。例如,可以用它来决定某条路由是否应当处于运行状态。不过,策略可以支持任何类型的使用场景。

工作原理

你将路由与给定的 RoutePolicy 关联起来,之后在运行时 Camel 会在这个策略上调用回调,你可以在其中实现自己的定制逻辑。Camel 提供了一个支持类 org.apache.camel.support.RoutePolicySupport,可以继承它并实现你的逻辑。

会被调用的回调有:

  • onInit
  • onRemove
  • onStart
  • onStop
  • onSuspend
  • onResume
  • onExchangeBegin
  • onExchangeDone

更多详情请参阅 org.apache.camel.spi.RoutePolicy 的 Javadoc;也可以参考 org.apache.camel.throttling.ThrottlingInflightRoutePolicy 的实现作为具体示例。

Camel 开箱即用地提供了以下策略:

  • org.apache.camel.throttling.ThrottlingInflightRoutePolicy —— 一种基于限流的策略,会根据当前在途 Exchange 的指标自动挂起/恢复路由。可以用它来动态限流,例如限制 JMS 消费者,避免其消费过快。
  • org.apache.camel.throttling.ThrottlingExceptionRoutePolicy —— 一种基于限流的策略,仿照断路器建模。该策略会根据抛出的异常类型和阈值设置来停止从某个端点消费。
  • org.apache.camel.impl.cluster.ClusteredRoutePolicy —— 是 camel-cluster 的基础,用于在某个节点成为集群领导者时使相应的 Camel 路由变为活动状态。

Camel 还可以通过 ScheduledRoutePolicy(由 Quartz 组件提供)按照一天中的特定时间来调度路由的激活、停用、挂起和/或恢复。

路由策略也被用作 Camel 部分可观测性组件的实现细节。

SuspendableService

如果你希望动态挂起/恢复路由,建议使用 SuspendableService,因为它支持细粒度的挂起与恢复操作。

ThrottlingInflightRoutePolicy

ThrottlingInflightRoutePolicy 在一个 Exchange 完成时被触发,这意味着至少需要有一个 Exchange 完成,它才会开始生效。

在途限流路由策略具有以下选项:

选项默认值说明
scopeRoute作用域,可取 Route 或 Context,用于定义当前在途(in flight)交换的数量是基于上下文还是基于特定路由。
maxInflightExchanges1000最大阈值,当在途交换的数量超过此值时,限流将开始挂起该路由。
resumePercentOfMax70一个 0..100 的百分比,用于定义在被挂起之后,限流应在何时恢复。
loggingLevelINFO用于记录限流活动的日志级别。
loggerThrottlingInflightRoutePolicy日志记录器类别。

ThrottlingInflightRoutePolicy 与 Throttler EIP 的比较

ThrottlingInflightRoutePolicy 与 Throttler EIP 相比,其特点是在限流期间不会阻塞。它的限流是基于近似值的,这意味着其粒度较粗,不像 Throttler EIP 那样精确。

Throttler EIP 可以准确得多,只允许在给定时间单位内通过特定数量的消息。此外,ThrottlingInflightRoutePolicy 的度量基于在途交换的数量,而 Throttler EIP 的度量基于每个时间单位的消息数量。

ScheduledRoutePolicy

有关基于调度的路由策略,请参见 Scheduled Route Policy。

在 Camel 路由中使用 RoutePolicy

在需要使用一个或多个路由策略的路由上,按如下方式配置:

  • Java
  • XML
  • YAML

在 Java DSL 中,使用 routePolicy 方法按如下方式配置路由策略:

RoutePolicy myPolicy = new MyRoutePolicy();

from("seda:foo")
    .routePolicy(myPolicy)
    .to("mock:result");

在 XML 中,你可以通过 <route> 上的 routePolictRef 属性进行配置,如下所示:

<bean id="myPolicy" class="com.mycompany.MyRoutePolicy"/>

<route routePolicyRef="myPolicy">
    <from uri="seda:foo"/>
    <to uri="mock:result"/>
</route>

在 YAML 中,您通过在 route 节点上使用 routePolictRef 属性进行配置,如下所示:

- route:
    routePolicyRef: myPolicy
    from:
      uri: seda:foo
      steps:
        - to:
            uri: mock:result

你可以配置一个或多个路由策略(RoutePolicy,多个之间用逗号分隔),例如:

  • Java
  • XML
  • YAML
from("seda:foo")
    .routePolicy(myPolicy, myOtherPolicy)
    .to("mock:result");
<bean id="myPolicy" class="com.mycompany.MyRoutePolicy"/>

<route routePolicyRef="myPolicy,myOtherPolicy">
    <from uri="seda:foo"/>
    <to uri="mock:result"/>
</route>
- route:
    routePolicyRef: myPolicy,myOtherPolicy
    from:
      uri: seda:foo
      steps:
        - to:
            uri: mock:result

使用 RoutePolicyFactory

如果想为每条路由都使用路由策略,可以使用 org.apache.camel.spi.RoutePolicyFactory 作为工厂,为每条路由创建新的 RoutePolicy 实例。当你希望所有路由都使用同一种路由策略时,可以采用这种方式。

通过该工厂,你只需配置一次,之后创建的每条路由都会自动分配该策略。

CamelContext 提供了用于添加工厂的 API,示例如下

  • Java
  • Spring Boot
  • Quarkus
  • Spring XML
  • XML
  • YAML
CamelContext context = ...
context.addRoutePolicyFactory(new MyRoutePolicyFactory());

你还可以用 Spring Boot 的 @Component 注解标记你的类,以实现自动依赖注入。

@Component
public class MyRoutePolicyFactory() {

}

你也可以为你的类标注 Quarkus 的 @.ApplicationScoped,从而实现自动依赖注入。

@ApplicationScoped
public class MyRoutePolicyFactory() {

}

在 Spring XML DSL 中,你只需定义一个包含该工厂的 <bean>,Camel 会自动检测到这个工厂:

<bean id="myRoutePolicyFactory" class="com.foo.MyRoutePolicyFactory"/>
<bean name="myRoutePolicyFactory" type="com.foo.MyRoutePolicyFactory"/>
- beans:
    - name: myRoutePolicyFactory
      type: com.foo.MyRoutePolicyFactory
你可以拥有任意数量的路由策略工厂,因此如果有两个工厂,直接把两者都添加进去即可。

评论

登录后参与评论

正在加载评论…