8.9. Delayer

概要

Delayer は、受信メッセージに 相対的な 遅延を適用できるプロセッサーです。

Java DSL の例

delay() コマンドを使用して、受信メッセージに 相対的な 遅延 (ミリ秒単位) を追加することができます。たとえば、以下のルートは、すべての受信メッセージを 2 秒遅延します。

from("seda:a").delay(2000).to("mock:result");

あるいは、式を使用して遅延を指定することもできます。

from("seda:a").delay(header("MyDelay")).to("mock:result");

delay() に続く DSL コマンドは、delay() のサブ句として解釈されます。そのため、場合によっては end() コマンドを挿入して、delay() のサブ句を終了する必要があります。たとえば、delay()onException() 句の中にある場合、以下のように終了します。

from("direct:start")
    .onException(Exception.class)
        .maximumRedeliveries(2)
        .backOffMultiplier(1.5)
        .handled(true)
        .delay(1000)
            .log("Halting for some time")
            .to("mock:halt")
        .end()
    .end()
    .to("mock:result");

XML 設定の例

以下は、XML DSL で delay を使用した例となります。

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="seda:a"/>
        <delay>
            <header>MyDelay</header>
        </delay>
        <to uri="mock:result"/>
    </route>
    <route>
        <from uri="seda:b"/>
        <delay>
            <constant>1000</constant>
        </delay>
        <to uri="mock:result"/>
    </route>
</camelContext>

カスタム delay の作成

式と Bean を組み合わせて使用して、以下のように遅延を決定することができます。

from("activemq:foo").
  delay().expression().method("someBean", "computeDelay").
  to("activemq:bar");

Bean クラスは以下のように定義することができます。

public class SomeBean {
  public long computeDelay() {
     long delay = 0;
     // use java code to compute a delay value in millis
     return delay;
 }
}

非同期の遅延

Delayer に、ノンブロッキングの非同期遅延 を使用させることができます。これは、Apache Camel がタスクを今後実行するようにスケジュールすることを意味します。このタスクは、ルートの後半部分 (Delayer の後) の処理を担当します。これにより、呼び出し元スレッドはブロックされず、次の受信メッセージに対応することができます。以下に例を示します。

from("activemq:queue:foo")
    .delay(1000)
    .asyncDelayed()
    .to("activemq:aDelayedQueue");

以下のように XML DSL で同じルートを作成できます。

<route>
   <from uri="activemq:queue:foo"/>
   <delay asyncDelayed="true">
       <constant>1000</constant>
   </delay>
   <to uri="activemq:aDealyedQueue"/>
   </route>

オプション

Delayer パターンでは、以下のオプションがサポートされます。

名前

デフォルト値

説明

asyncDelayed

false

Camel 2.4: 有効にすると、遅延しているメッセージはスケジュールされたスレッドプールを使用して非同期的に実行されます。

executorServiceRef

 

Camel 2.4: asyncDelay が有効になっている場合に使用される、カスタムスレッドプールへの参照。

callerRunsWhenRejected

true

Camel 2.4: asyncDelayed が有効な場合に使用されます。これは、スレッドプールがタスクを拒否した場合に、呼び出し元スレッドがタスクを実行するべきかどうかを制御します。