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. Date 类型来指定。定义日期实例的最灵活方法是通过 java.util.GregorianCalendar 类。使用 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);

调度任务

您可以使用简单的调度路由策略来定义以下一个或多个调度任务:

启动路由

下表列出了调度一个或多个路由启动的参数。

参数类型默认值描述

routeStartDate

java.util.Date

None

指定第一次启动路由时的日期和时间。

routeStartRepeatCount

int

0

当设置为非零值时,指定路由应启动的次数。

routeStartRepeatInterval

long

0

指定开始间隔,以毫秒为单位。

停止路由

下表列出了调度一个或多个路由停止的参数。

参数类型默认值描述

routeStopDate

java.util.Date

None

指定第一次停止路由时的日期和时间。

routeStopRepeatCount

int

0

当设置为非零值时,指定路由应停止的次数。

routeStopRepeatInterval

long

0

指定停止之间的间隔,以毫秒为单位。

routeStopGracePeriod

int

10000

指定在强制停止路由前等待当前交换完成处理(宽限期)的时长。在无限宽限期内设置为 0。

routeStopTimeUnit

long

TimeUnit.MILLISECONDS

指定宽限期的时间范围。

挂起路由

下表列出了用于调度一次或多次路由挂起的参数。

参数类型默认值描述

routeSuspendDate

java.util.Date

None

指定第一次暂停路由时的日期和时间。

routeSuspendRepeatCount

int

0

当设置为非零值时,指定路由应暂停的次数。

routeSuspendRepeatInterval

long

0

指定挂起之间的时间间隔,以毫秒为单位。

恢复路由

下表列出了用于调度一次或多次重新消耗的参数。

参数类型默认值描述

routeResumeDate

java.util.Date

None

指定第一次恢复路由时的日期和时间。

routeResumeRepeatCount

int

0

当设置为非零值时,指定路由应恢复的次数。

routeResumeRepeatInterval

long

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 调度的路由策略来定义以下一个或多个调度任务:

启动路由

下表列出了调度一个或多个路由启动的参数。

参数类型默认值描述

routeStartString

字符串

None

指定触发一个或多个路由启动事件的 cron 表达式。

停止路由

下表列出了调度一个或多个路由停止的参数。

参数类型默认值描述

routeStopTime

字符串

None

指定触发一个或多个路由停止事件的 cron 表达式。

routeStopGracePeriod

int

10000

指定在强制停止路由前等待当前交换完成处理(宽限期)的时长。在无限宽限期内设置为 0。

routeStopTimeUnit

long

TimeUnit.MILLISECONDS

指定宽限期的时间范围。

挂起路由

下表列出了用于调度一次或多次路由挂起的参数。

参数类型默认值描述

routeSuspendTime

字符串

None

指定触发一个或多个路由挂起事件的 cron 表达式。

恢复路由

下表列出了用于调度一次或多次重新消耗的参数。

参数类型默认值描述

routeResumeTime

字符串

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> 的其他工厂。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.