路由策略
RoutePolicy
路由策略 org.apache.camel.spi.RoutePolicy 用于在运行时控制路由。例如,可以用它来决定某条路由是否应当处于运行状态。不过,策略可以支持任何类型的使用场景。
工作原理
你将路由与给定的 RoutePolicy 关联起来,之后在运行时 Camel 会在这个策略上调用回调,你可以在其中实现自己的定制逻辑。Camel 提供了一个支持类 org.apache.camel.support.RoutePolicySupport,可以继承它并实现你的逻辑。
会被调用的回调有:
onInitonRemoveonStartonStoponSuspendonResumeonExchangeBeginonExchangeDone
更多详情请参阅 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 完成,它才会开始生效。
在途限流路由策略具有以下选项:
| 选项 | 默认值 | 说明 |
|---|---|---|
scope | Route | 作用域,可取 Route 或 Context,用于定义当前在途(in flight)交换的数量是基于上下文还是基于特定路由。 |
maxInflightExchanges | 1000 | 最大阈值,当在途交换的数量超过此值时,限流将开始挂起该路由。 |
resumePercentOfMax | 70 | 一个 0..100 的百分比,用于定义在被挂起之后,限流应在何时恢复。 |
loggingLevel | INFO | 用于记录限流活动的日志级别。 |
logger | ThrottlingInflightRoutePolicy | 日志记录器类别。 |
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| 你可以拥有任意数量的路由策略工厂,因此如果有两个工厂,直接把两者都添加进去即可。 |
|---|
评论
登录后参与评论
KnowForge