2.10.2. 単純な定期実行ルートポリシー

概要

定期実行ルートポリシーは、ルートの開始、停止、一時停止、および再開を可能にするルートポリシーで、これらのイベントのタイミングは、初回イベントの発生時刻で指定し、(オプションで) その後の繰り返し回数も指定できます。単純な定期実行ルートポリシーを定義するには、以下のクラスのインスタンスを作成します。

org.apache.camel.routepolicy.quartz.SimpleScheduledRoutePolicy

依存関係

単純な定期実行ルートポリシーは、Quartz コンポーネント camel-quartz に依存しています。たとえば、Maven をビルドシステムとして使用する場合は、アーティファクト camel-quartz の依存関係を追加してください。

Java DSL の例

例2.7「単純な定期実行ルートの Java DSL の例」 は、Java DSL を使用して起動するルートをスケジュールする方法を示しています。初回の起動時刻 startTime は、現在時刻から 3 秒後に設定されています。また、このポリシーは、初期起動時刻の 3 秒後に、2 回目のルートを開始するように設定されています。これは、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 では、route 要素に 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() を呼び出して Date インスタンスを取得します。

たとえば、2011 年 1 月 1 日正午の日時を定義するには、以下のように GregorianCalendar コンストラクターを呼び出します。

// 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 クラスは、異なるタイムゾーンの時間の定義もサポートします。デフォルトでは、コンピューターのローカルタイムゾーンを使用します。

正常シャットダウン

単純な定期実行ルートポリシーを設定してルートを停止すると、ルートの停止アルゴリズムが自動的に正常シャットダウンの手順に統合されます (「ルートの起動およびシャットダウンの制御」 を参照)。よって、タスクは現在のエクスチェンジが処理を完了するまで待機してから、ルートをシャットダウンします。ただし、タイムアウトを設定することで、ルートがエクスチェンジの処理を終了したかどうかにかかわらず、指定した時間後にルートを強制的に停止することができます。

タイムアウト時の処理中エクスチェンジのロギング

指定のタイムアウト期間内に正常シャットダウンが適切に行われなかった場合、Apache Camel はより強行なシャットダウンを実行します。ルートやスレッドプールなどを強制的にシャットダウンします。

タイムアウト後、Apache Camel は現在処理中のエクスチェンジの情報をログに記録します。エクスチェンジの元および現在のルートをログに記録します。

たとえば、以下のログは、1 つの処理中のエクスチェンジがあり、その元のルートは 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);

タスクのスケジューリング

単純な定期実行ルートポリシーを使用して、以下のスケジュールタスクのいずれかを定義することができます。

ルートの開始

次の表は、ルートの開始を 1 回以上スケジューリングするためのパラメーターを示しています。

パラメーターデフォルト説明

routeStartDate

java.util.Date

なし

ルートの初回起動日時を指定します。

routeStartRepeatCount

int

0

0 以外の値に設定すると、ルートの開始回数が指定されます。

routeStartRepeatInterval

long

0

開始の間隔 (ミリ秒単位) を指定します。

ルートの停止

次の表は、ルートの停止を 1 回以上スケジューリングするためのパラメーターを示しています。

パラメーターデフォルト説明

routeStopDate

java.util.Date

なし

ルートの初回停止日時を指定します。

routeStopRepeatCount

int

0

0 以外の値に設定すると、ルートの停止回数が指定されます。

routeStopRepeatInterval

long

0

停止の間隔 (ミリ秒単位) を指定します。

routeStopGracePeriod

int

10000

ルートを強制停止する前に、現在のエクスチェンジの処理が終了するまで待つ時間 (猶予期間) を指定します。猶予期間が無限の場合は 0 に設定します。

routeStopTimeUnit

long

TimeUnit.MILLISECONDS

猶予期間の時間単位を指定します。

ルートの一時停止

次の表は、ルートの一時停止を 1 回以上スケジュールするためのパラメーターを示しています。

パラメーターデフォルト説明

routeSuspendDate

java.util.Date

なし

ルートが初めて一時停止される日時を指定します。

routeSuspendRepeatCount

int

0

0 以外の値に設定すると、ルートが一時停止される回数が指定されます。

routeSuspendRepeatInterval

long

0

一時停止の間隔 (ミリ秒単位) を指定します。

ルートの再開

次の表は、ルートの再開を 1 回以上スケジュールするためのパラメーターを示しています。

パラメーターデフォルト説明

routeResumeDate

java.util.Date

なし

ルートの初回再開日時を指定します。

routeResumeRepeatCount

int

0

0 以外の値に設定すると、ルートの再開回数が指定されます。

routeResumeRepeatInterval

long

0

再開の間隔をミリ秒単位で指定します。