2.10. 调度的路由策略
2.10.1. Scheduled Route 策略概述 复制链接链接已复制到粘贴板!
概述 复制链接链接已复制到粘贴板!
调度的路由策略可用于触发在运行时影响路由的事件。特别是,当前可用的实现可让您在策略指定的任何时间(或时间)启动、停止、挂起或恢复路由。
调度任务 复制链接链接已复制到粘贴板!
调度的路由策略能够触发以下类型的事件:
- 在指定时间(或时间) 启动 路由 mvapich-wagonstart 路由。只有路由当前处于已停止状态时,此事件才会生效。
- 停止在指定时间 (或时间)时停止路由 osgi-wagon 停止路由。只有路由当前处于活跃状态时,此事件才会生效。
-
在路由 开始时挂起一个路由 mvapich- iwltemporarily de-activate consumer 端点(如
from ()
中指定的)。其余路由仍处于活动状态,但客户端将无法将新消息发送到路由。 - 在路由开始时恢复 路由 criu-wagonre-activate consumer 端点,将路由返回到完全活跃状态。
quartz 组件 复制链接链接已复制到粘贴板!
Quartz 组件是一个计时器组件,基于 Terracotta 的 Quartz,它是作业调度程序的开源实施。Quartz 组件为简单的调度路由策略和 cron 调度的路由策略提供底层实施。
2.10.2. 简单调度的路由策略 复制链接链接已复制到粘贴板!
概述 复制链接链接已复制到粘贴板!
简单的调度路由策略是一个路由策略,可让您启动、停止、挂起和恢复路由,通过提供初始事件的时间和日期来定义这些事件的时间和日期(可选)。要定义一个简单的调度路由策略,请创建以下类实例:
org.apache.camel.routepolicy.quartz.SimpleScheduledRoutePolicy
org.apache.camel.routepolicy.quartz.SimpleScheduledRoutePolicy
依赖项 复制链接链接已复制到粘贴板!
简单的调度路由策略依赖于 Quartz 组件 camel-quartz
。例如,如果您使用 Maven 作为构建系统,则需要添加对 camel-quartz
工件的依赖项。
Java DSL 示例 复制链接链接已复制到粘贴板!
例 2.7 “Simple Scheduled Route 的 Java DSL 示例” 演示了如何调度路由以使用 Java DSL 启动。初始开始时间( startTime
)被定义为当前时间后面的 3 秒。该策略也被配置为在初始开始时间后启动路由 3 秒,该时间通过将 routeStartRepeatCount
设置为 1,并将 routeStartRepeatInterval
设置为 3000 毫秒。
在 Java DSL 中,您可以通过调用路由中的 routePolicy ()
DSL 命令将路由策略附加到路由。
例 2.7. Simple Scheduled Route 的 Java DSL 示例
您可以通过调用带有多个参数的 routePolicy ()
来在路由上指定多个策略。
XML DSL 示例 复制链接链接已复制到粘贴板!
例 2.8 “Simple Scheduled Route 的 XML DSL 示例” 演示了如何调度路由以使用 XML DSL 启动。
在 XML DSL 中,您可以通过设置 route 元素上的 routePolicyRef
属性将 路由
策略附加到路由。
例 2.8. Simple Scheduled Route 的 XML DSL 示例
您可以通过将 routePolicyRef
的值设置为以逗号分隔的 bean ID 列表,在路由上指定多个策略。
定义日期和时间 复制链接链接已复制到粘贴板!
简单调度路由策略中使用的触发器的初始时间使用 java.util.Date
类型指定。定义 Date
实例的最灵活的方法是通过 java.util.GregorianCalendar 类。使用 GregorianCalendar
类的方便构造器和方法来定义日期,然后通过调用 GregorianCalendar.getTime ()
获取 日期
实例。
例如,要定义 2011 年 1 月 1 日的时间和日期,请致电 GregorianCalendar
结构,如下所示:
GregorianCalendar
类也支持在不同时区中定义时间。默认情况下,它使用您计算机上的本地时区。
正常关闭 复制链接链接已复制到粘贴板!
当您配置一个简单的调度路由策略来停止路由时,路由停止算法会自动与安全关闭流程集成(请参阅 第 2.9 节 “控制路由启动和关闭”)。这意味着,该任务在关闭路由前等待当前交换完成处理。您可以设置超时,它会强制路由在指定时间后停止,无论路由是否完成处理交换。
在超时时登录动态交换 复制链接链接已复制到粘贴板!
如果安全关闭无法在给定超时时间内完全关闭,则 Apache Camel 会执行更积极的关闭。它强制路由、threadpools 等关闭。
超时后,Apache Camel 会记录有关当前动态交换的信息。它记录交换的来源和当前的交换路由。
例如,以下日志显示有一个 inflight 交换,来自 route1 的来源,目前位于 delay1 节点的同一 route1 中。
在安全关闭过程中,如果您在 org.apache.camel.impl.DefaultShutdownStrategy
上启用 DEBUG 日志记录级别,则它会记录相同的 inflight Exchange 信息。
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]
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);
context.getShutdownStrategegy().setLogInflightExchangesOnTimeout(false);
调度任务 复制链接链接已复制到粘贴板!
您可以使用简单的调度路由策略来定义以下一个或多个调度任务:
启动路由 复制链接链接已复制到粘贴板!
下表列出了调度一个或多个路由启动的参数。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| None | 指定第一次启动路由的日期和时间。 |
|
|
| 当设置为非零值时,指定路由应启动的次数。 |
|
|
| 以毫秒为单位,指定 start 之间的时间间隔。 |
停止路由 复制链接链接已复制到粘贴板!
下表列出了调度一个或多个路由停止的参数。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| None | 指定路由首次停止的日期和时间。 |
|
|
| 当设置为非零值时,指定路由应停止的次数。 |
|
|
| 以毫秒为单位指定停止之间的时间间隔。 |
|
|
| 指定在强制停止路由前等待当前交换完成处理(宽限期)的时间。对于无限宽限期,设置为 0。 |
|
|
| 指定宽限期的时间单位。 |
挂起路由 复制链接链接已复制到粘贴板!
下表列出了调度路由一次或多次使用的参数。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| None | 指定路由首次暂停的日期和时间。 |
|
| 0 | 当设置为非零值时,指定路由应暂停的次数。 |
|
| 0 | 以毫秒为单位指定挂起之间的时间间隔。 |
恢复路由 复制链接链接已复制到粘贴板!
下表列出了用于调度路由一次或多次恢复的参数。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| None | 指定路由首次恢复的日期和时间。 |
|
| 0 | 当设置为非零值时,指定路由应恢复的次数。 |
|
| 0 | 指定恢复之间的时间间隔,以毫秒为单位。 |
2.10.3. Cron Scheduled Route 策略 复制链接链接已复制到粘贴板!
概述 复制链接链接已复制到粘贴板!
cron 调度的路由策略是一个路由策略,可让您启动、停止、挂起和恢复路由,其中这些事件的时间使用 cron 表达式指定。要定义 cron 调度的路由策略,请创建以下类实例:
org.apache.camel.routepolicy.quartz.CronScheduledRoutePolicy
org.apache.camel.routepolicy.quartz.CronScheduledRoutePolicy
依赖项 复制链接链接已复制到粘贴板!
简单的调度路由策略依赖于 Quartz 组件 camel-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 示例
您可以通过调用带有多个参数的 routePolicy ()
来在路由上指定多个策略。
XML DSL 示例 复制链接链接已复制到粘贴板!
例 2.10 “Cron Scheduled Route 的 XML DSL 示例”演示了如何调度路由以使用 XML DSL 启动。
在 XML DSL 中,您可以通过设置 route 元素上的 routePolicyRef
属性将 路由
策略附加到路由。
例 2.10. Cron Scheduled Route 的 XML DSL 示例
您可以通过将 routePolicyRef
的值设置为以逗号分隔的 bean ID 列表,在路由上指定多个策略。
定义 cron 表达式 复制链接链接已复制到粘贴板!
cron 表达式 语法在 UNIX cron
工具中包含其起源,这会调度在 UNIX 系统上在后台运行的作业。cron 表达式是通配符日期和时间的语法,可让您定期指定单个事件或多个事件。
cron 表达式由以下顺序包括 6 或 7 个字段:
Seconds Minutes Hours DayOfMonth Month DayOfWeek [Year]
Seconds Minutes Hours DayOfMonth Month DayOfWeek [Year]
Year
字段是可选的,通常会被忽略,除非您想定义仅一次和一次发生的事件。每个字段都由一个字面字符和特殊字符的组合组成。例如,以下 cron 表达式指定每天在午夜触发一次的事件:
0 0 24 * * ?
0 0 24 * * ?
*
字符是一个通配符,与字段的每个值匹配。因此,前面的表达式与每月的每天匹配。?
字符是一个 dummy 占位符,表示 *ignore this field*。它始终会出现在 DayOfMonth
字段或 DayOfWeek
字段中,因为它无法同时指定这两个字段。例如,如果要调度一个每天触发一次的事件,但只能从 Monday 到 Friday,请使用以下 cron 表达式:
0 0 24 ? * MON-FRI
0 0 24 ? * MON-FRI
其中连字符字符指定范围 MON-FRI
。您还可以使用正斜杠字符 /
指定递增。例如,要指定事件每 5 分钟触发一次,请使用以下 cron 表达式:
0 0/5 * * * ?
0 0/5 * * * ?
有关 cron 表达式语法的完整说明,请参阅 CRON 表达式 的 Wikipedia 文章。
调度任务 复制链接链接已复制到粘贴板!
您可以使用 cron 调度的路由策略来定义以下一个或多个调度任务:
启动路由 复制链接链接已复制到粘贴板!
下表列出了调度一个或多个路由启动的参数。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| None | 指定触发一个或多个路由启动事件的 cron 表达式。 |
停止路由 复制链接链接已复制到粘贴板!
下表列出了调度一个或多个路由停止的参数。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| None | 指定触发一个或多个路由停止事件的 cron 表达式。 |
|
|
| 指定在强制停止路由前等待当前交换完成处理(宽限期)的时间。对于无限宽限期,设置为 0。 |
|
|
| 指定宽限期的时间单位。 |
挂起路由 复制链接链接已复制到粘贴板!
下表列出了调度路由一次或多次使用的参数。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| None | 指定触发一个或多个路由挂起事件的 cron 表达式。 |
恢复路由 复制链接链接已复制到粘贴板!
下表列出了用于调度路由一次或多次恢复的参数。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| None | 指定触发一个或多个路由恢复事件的 cron 表达式。 |
2.10.4. 路由策略工厂 复制链接链接已复制到粘贴板!
使用路由策略工厂 复制链接链接已复制到粘贴板!
从 Camel 2.14 开始提供
如果要为每个路由使用路由策略,您可以使用 org.apache.camel.spi.RoutePolicyFactory
作为每个路由创建 RoutePolicy
实例的工厂。当您想为每个路由使用相同的路由策略时,可以使用此选项。然后,您只需要配置工厂一次,创建的每个路由都会分配策略。
CamelContext 上有 API 添加工厂,如下所示:
context.addRoutePolicyFactory(new MyRoutePolicyFactory());
context.addRoutePolicyFactory(new MyRoutePolicyFactory());
从 XML DSL 中,您只能使用工厂定义 <bean
>
<bean id="myRoutePolicyFactory" class="com.foo.MyRoutePolicyFactory"/>
<bean id="myRoutePolicyFactory" class="com.foo.MyRoutePolicyFactory"/>
factory 包含用于创建路由策略的 createRoutePolicy 方法。
请注意,您可以根据需要拥有多个路由策略工厂。只需再次调用 addRoutePolicyFactory
,或者在 XML 中将其他工厂声明为 < ;bean&
gt;。