2.10.2. 简单调度的路由策略
概述
简单的调度路由策略是一个路由策略,可让您启动、停止、挂起和恢复路由,其中通过指定一定数量的后续 repititions 定义这些事件的时间和日期(可选)。要定义简单的调度路由策略,请创建以下类实例:
org.apache.camel.routepolicy.quartz.SimpleScheduledRoutePolicy
依赖项
简单调度的路由策略取决于 Quartz 组件 camel-quartz
。例如,如果您使用 Maven 作为构建系统,则需要添加对 camel-quartz
工件的依赖项。
Java DSL 示例
例 2.7 “简单调度路由的 Java DSL 示例” 演示了如何调度路由以使用 Java DSL 启动。初始的开始时间 startTime
定义为当前时间之后的 3 秒。该策略也被配置为在初始开始时间后启动路由,3 秒(通过将 routeStartRepeatCount
设置为 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 “简单调度路由的 XML DSL 示例” 演示了如何调度路由以使用 XML DSL 启动。
在 XML DSL 中,您可以通过设置路由元素上的 routePolicyRef
属性将路由策略附加到 路由
。
例 2.8. 简单调度路由的 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.Date
类型指定的。定义 Date
实例的最灵活方法是通过 java.util.GregorianCalendar 类。使用 GregorianCalendar
类的方便构建者和方法来定义日期,然后通过调用 GregorianCalendar.getTime()
获取 日期
。
例如,要在 2011 年 1 月 1 日之前定义时间和日期,请致电 GregorianCalendar
constructor,如下所示:
// 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 节 “控制路由启动和关闭”)。这意味着该任务会等待当前交换完成处理,然后再关闭路由。但是,您可以设置超时,它会强制路由在指定时间后停止,无论路由是否完成交换过程。
超时记录动态交换
如果安全关闭无法在给定的超时时间内完全关闭,那么 Apache Camel 将执行更积极的关机。它强制关闭路由、线程池等。
在超时后,Apache Camel 会记录有关当前动态交换的信息。它记录交换的源和当前交换路由。
例如,以下日志显示有一个动态的交换,来自 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);
调度任务
您可以使用简单的调度路由策略来定义一个或多个以下调度任务:
启动路由
下表列出了调度一个或多个路由启动的参数。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| 无 | 指定首次启动路由时的日期和时间。 |
|
|
| 当设置为非零值时,可指定路由应启动的次数。 |
|
|
| 指定启动之间的间隔,以毫秒为单位。 |
停止路由
下表列出了调度一个或多个路由的参数停止。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| 无 | 指定首次停止路由时的日期和时间。 |
|
|
| 当设置为非零值时,可指定路由应该停止的次数。 |
|
|
| 指定停止之间的时间间隔,单位为毫秒。 |
|
|
| 指定在强制停止路由前等待当前交换完成(宽限期)的时长。在无限宽限期内设置为 0。 |
|
|
| 指定宽限期的时间范围。 |
挂起路由
下表列出了用于调度路由启动或多次处理的参数。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| 无 | 指定首次暂停路由的时间和时间。 |
|
| 0 | 当设置为非零值时,可指定路由应该暂停的次数。 |
|
| 0 | 指定挂起之间的时间间隔,单位为毫秒。 |
恢复路由
下表列出了用于调度一个或多个路由恢复的参数。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
| 无 | 指定首次恢复路由的时间和时间。 |
|
| 0 | 当设置为非零值时,指定应恢复路由的次数。 |
|
| 0 | 指定恢复间隔,以毫秒为单位。 |