2.10. 调度的路由策略
2.10.1. Scheduled Route 策略概述
概述
调度的路由策略可用于触发影响运行时路由的事件。特别是,目前可用的实施可让您在策略指定的任何时间(或时间)启动、停止、暂停或恢复路由。
调度任务
调度的策略可以触发以下事件类型:
- 在指定的时间 (或时间)启动时启动路由 主机上运行的路由。只有当路由当前处于已停止状态、等待激活时,此事件才会生效。
- 在指定的时间 (或时间)停止路由。只有路由当前处于活跃状态时,此事件才生效。
-
在路由开始时,挂起 路由 <.>-方式停用消费者端点(
如从()
中指定的)。路由的其余部分仍处于活跃状态,但客户端无法向路由发送新消息。 - 在路由开始时恢复 路由 只有激活使用者端点,将路由返回到完全主动状态。
Quartz 组件
Quartz 组件是一个基于 Terracotta 的 Quartz 定时器组件,它是作业调度程序的开源实施。Quartz 组件为简单的调度路由策略和 cron 调度路由策略提供了底层的实现。
2.10.2. 简单调度的路由策略
概述
简单的调度路由策略是一个路由策略,可让您启动、停止、挂起和恢复路由,其中通过提供初始事件的时间和日期来定义这些事件的时间和日期,(可选)通过指定一定数量的后续重试。要定义一个简单的调度路由策略,请创建一个以下类实例:
org.apache.camel.routepolicy.quartz.SimpleScheduledRoutePolicy
依赖项
简单的调度路由策略取决于 Quartz 组件 ll -quartz
。例如,如果您使用 Maven 作为构建系统,则需要添加对 camel-quartz
工件的依赖关系。
Java DSL 示例
例 2.7 “用于简单调度的路由的 Java DSL 示例” 介绍如何调度要使用 Java DSL 启动的路由。初始开始时间( startTime
)定义为当前时间后的 3 秒。该策略还配置为在初始开始时间后启动路由,3 秒后,通过将 routeStartRepeatCount
设置为 1,并将 routeStartRepeatInterval 设置为 1,并将 routeStartRepeatInterval
设置为 3000 毫秒。
在 Java DSL 中,您可以通过调用路由中的 routePolicy ()
DSL 命令将路由策略附加到路由。
例 2.7. 用于简单调度的路由的 Java DSL 示例
// Java
SimpleScheduledRoutePolicy policy = new SimpleScheduledRoutePolicy();
long startTime = System.currentTimeMillis() + 3000L;
policy.setRouteStartDate(new Date(startTime));
policy.setRouteStartRepeatCount(1);
policy.setRouteStartRepeatInterval(3000);
from("direct:start")
.routeId("test")
.routePolicy(policy)
.to("mock:success");
您可以通过使用多个参数调用 routePolicy ()
来指定路由中的多个策略。
XML DSL 示例
例 2.8 “Simple Scheduled Route 的 XML DSL 示例” 显示如何使用 XML DSL 调度路由启动。
在 XML DSL 中,您可以通过设置路由元素上的 routePolicyRef
属性将路由策略附加到 路由
。
例 2.8. Simple Scheduled Route 的 XML DSL 示例
<bean id="date" class="java.util.Data"/>
<bean id="startPolicy" class="org.apache.camel.routepolicy.quartz.SimpleScheduledRoutePolicy">
<property name="routeStartDate" ref="date"/>
<property name="routeStartRepeatCount" value="1"/>
<property name="routeStartRepeatInterval" value="3000"/>
</bean>
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route id="myroute" routePolicyRef="startPolicy">
<from uri="direct:start"/>
<to uri="mock:success"/>
</route>
</camelContext>
您可以通过将 routePolicyRef
的值设置为用逗号分开的 bean ID 列表来指定路由上的多个策略。
定义日期和时间
简单调度路由策略中使用的触发器的初始时间使用 java.util.
类型来指定。定义日期实例的最灵活方法是通过 java.util.GregorianCalendar 类。使用 Date
GregorianCalendar
类的方便构造器和方法来定义日期,然后通过调用 GregorianCalendar.getTime ()
获取 日期
实例。
例如,要定义 2011 年 1 月 1 日的时间和日期,请致电 GregorianCalendar
or,如下所示:
// Java import java.util.GregorianCalendar; import java.util.Calendar; ... GregorianCalendar gc = new GregorianCalendar( 2011, Calendar.JANUARY, 1, 12, // hourOfDay 0, // minutes 0 // seconds ); java.util.Date triggerDate = gc.getTime();
GregorianCalendar
类还支持定义不同时区的时间。默认情况下,它会使用您计算机上的本地时区。
正常关闭
当您将简单的调度路由策略配置为停止路由时,路由停止算法会自动与安全关闭过程集成(请参阅 第 2.9 节 “控制开始和关闭路由”)。这意味着该任务会等待当前交换完成处理,然后再关闭路由。但是,您可以设置一个超时,它会强制路由在指定时间后停止,无论路由是否完成交换处理。
在 Timeout 超时时记录开机交换
如果正常关机无法在给定的超时时间内完全关闭,那么 Apache Camel 将执行更加积极的关闭。它强制路由、threadpool 等路由关闭。
超时后,Apache Camel 会记录关于当前航班交换器的信息。它记录交换的来源和当前交换路由。
例如,以下日志显示了一个 inflight 交换器,该交换来自于 route1,目前在 delay1 节点上位于同一 route1。
在正常关闭过程中,如果您在 org.apache.camel.impl.DefaultShutdownStrategy
上启用 DEBUG 日志记录级别,则会记录相同的动态交换信息。
2015-01-12 13:23:23,656 [- ShutdownTask] INFO DefaultShutdownStrategy - There are 1 inflight exchanges: InflightExchange: [exchangeId=ID-davsclaus-air-62213-1421065401253-0-3, fromRouteId=route1, routeId=route1, nodeId=delay1, elapsed=2007, duration=2017]
如果您不想看到这些日志,您可以通过将选项 logInflightExchangesOnTimeout
设置为 false 来关闭此日志。
context.getShutdownStrategegy().setLogInflightExchangesOnTimeout(false);
调度任务
您可以使用简单的调度路由策略来定义以下一个或多个调度任务:
启动路由
下表列出了调度一个或多个路由启动的参数。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| None | 指定第一次启动路由时的日期和时间。 |
|
|
| 当设置为非零值时,指定路由应启动的次数。 |
|
|
| 指定开始间隔,以毫秒为单位。 |
停止路由
下表列出了调度一个或多个路由停止的参数。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| None | 指定第一次停止路由时的日期和时间。 |
|
|
| 当设置为非零值时,指定路由应停止的次数。 |
|
|
| 指定停止之间的间隔,以毫秒为单位。 |
|
|
| 指定在强制停止路由前等待当前交换完成处理(宽限期)的时长。在无限宽限期内设置为 0。 |
|
|
| 指定宽限期的时间范围。 |
挂起路由
下表列出了用于调度一次或多次路由挂起的参数。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| None | 指定第一次暂停路由时的日期和时间。 |
|
| 0 | 当设置为非零值时,指定路由应暂停的次数。 |
|
| 0 | 指定挂起之间的时间间隔,以毫秒为单位。 |
恢复路由
下表列出了用于调度一次或多次重新消耗的参数。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| None | 指定第一次恢复路由时的日期和时间。 |
|
| 0 | 当设置为非零值时,指定路由应恢复的次数。 |
|
| 0 | 指定恢复间隔(以毫秒为单位)。 |
2.10.3. Cron Scheduled Route 策略
概述
Cron scheduled 路由策略是一个路由策略,可让您启动、停止、挂起和恢复路由,其中使用 cron 表达式指定这些事件的时间。要定义 cron 调度的路由策略,请创建以下类的实例:
org.apache.camel.routepolicy.quartz.CronScheduledRoutePolicy
依赖项
简单的调度路由策略取决于 Quartz 组件 ll -quartz
。例如,如果您使用 Maven 作为构建系统,则需要添加对 camel-quartz
工件的依赖关系。
Java DSL 示例
例 2.9 “Cron Scheduled Route 的 Java DSL 示例” 介绍如何调度要使用 Java DSL 启动的路由。该策略配置有 cron 表达式 \*/3 * * * * ?
? 会触发每 3 秒启动事件。
在 Java DSL 中,您可以通过调用路由中的 routePolicy ()
DSL 命令将路由策略附加到路由。
例 2.9. Cron Scheduled Route 的 Java DSL 示例
// Java CronScheduledRoutePolicy policy = new CronScheduledRoutePolicy(); policy.setRouteStartTime("*/3 * * * * ?"); from("direct:start") .routeId("test") .routePolicy(policy) .to("mock:success");;
您可以通过使用多个参数调用 routePolicy ()
来指定路由中的多个策略。
XML DSL 示例
例 2.10 “Cron Scheduled Route 的 XML DSL 示例”显示如何使用 XML DSL 调度路由启动。
在 XML DSL 中,您可以通过设置路由元素上的 routePolicyRef
属性将路由策略附加到 路由
。
例 2.10. Cron Scheduled Route 的 XML DSL 示例
<bean id="date" class="org.apache.camel.routepolicy.quartz.SimpleDate"/> <bean id="startPolicy" class="org.apache.camel.routepolicy.quartz.CronScheduledRoutePolicy"> <property name="routeStartTime" value="*/3 * * * * ?"/> </bean> <camelContext xmlns="http://camel.apache.org/schema/spring"> <route id="testRoute" routePolicyRef="startPolicy"> <from uri="direct:start"/> <to uri="mock:success"/> </route> </camelContext>
您可以通过将 routePolicyRef
的值设置为用逗号分开的 bean ID 列表来指定路由上的多个策略。
定义 cron 表达式
cron 表达式语法 在 UNIX cron
实用程序中具有其原始卷,它会调度在 UNIX 系统上在后台运行的作业。Cron 表达式是通配符日期和时间的语法,可让您指定单个事件或多个定期递归的事件。
Cron 表达式按以下顺序由 6 或 7 个字段组成:
Seconds Minutes Hours DayOfMonth Month DayOfWeek [Year]
Year
字段是可选的,通常会省略,除非您想要定义一次且只运行一次的事件。每个字段由文字和特殊字符混合组成。例如,以下 cron 表达式指定每天午夜触发一次的事件:
0 0 24 * * ?
*
字符是一个通配符,与字段的每个值匹配。因此,前面的表达式与每月的每天匹配。?
字符是一个 dummy 占位符,表示*忽略此字段*。它始终会出现在 DayOfMonth
字段或 DayOfWeek
字段中,因为它没有逻辑上一致地指定这两个字段。例如,如果要调度一天一次触发的事件,但仅从星期一到周五,使用以下 cron 表达式:
0 0 24 ? * MON-FRI
其中连字符字符指定范围 MON-FRI
。您还可以使用正斜杠字符 /
指定增量。例如,要指定事件每 5 分钟触发,请使用以下 cron 表达式:
0 0/5 * * * ?
有关 cron 表达式语法的完整说明,请参阅 CRON 表达式 的维基百科文章。
调度任务
您可以使用 cron 调度的路由策略来定义以下一个或多个调度任务:
启动路由
下表列出了调度一个或多个路由启动的参数。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| None | 指定触发一个或多个路由启动事件的 cron 表达式。 |
停止路由
下表列出了调度一个或多个路由停止的参数。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| None | 指定触发一个或多个路由停止事件的 cron 表达式。 |
|
|
| 指定在强制停止路由前等待当前交换完成处理(宽限期)的时长。在无限宽限期内设置为 0。 |
|
|
| 指定宽限期的时间范围。 |
挂起路由
下表列出了用于调度一次或多次路由挂起的参数。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| None | 指定触发一个或多个路由挂起事件的 cron 表达式。 |
恢复路由
下表列出了用于调度一次或多次重新消耗的参数。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| None | 指定触发一个或多个路由恢复事件的 cron 表达式。 |
2.10.4. 路由策略系数
使用 Route 策略工厂
可从 Camel 2.14 开始
如果要为每个路由使用路由策略,可以使用 org.apache.camel.spi.RoutePolicyFactory
作为每个路由创建 RoutePolicy
实例的工厂。当您想要为每个路由使用相同的路由策略时,可以使用它。然后,您只需要配置工厂一次,创建的每个路由都会分配策略。
CamelContext 中存在一个 API 来添加工厂,如下所示:
context.addRoutePolicyFactory(new MyRoutePolicyFactory());
从 XML DSL 中,您只能使用工厂定义 <bean
>
<bean id="myRoutePolicyFactory" class="com.foo.MyRoutePolicyFactory"/>
factory 包含用于创建路由策略的 createRoutePolicy 方法。
/** * Creates a new {@link org.apache.camel.spi.RoutePolicy} which will be assigned to the given route. * * @param camelContext the camel context * @param routeId the route id * @param route the route definition * @return the created {@link org.apache.camel.spi.RoutePolicy}, or <tt>null</tt> to not use a policy for this route */ RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, RouteDefinition route);
请注意,您可以根据需要有很多路由策略工厂。只需再次调用 addRoutePolicyFactory
,或者在 XML 中声明为 < bean>
的其他工厂。