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 パターンでは、以下のオプションがサポートされます。
名前 | デフォルト値 | 説明 |
|
| Camel 2.4: 有効にすると、遅延しているメッセージはスケジュールされたスレッドプールを使用して非同期的に実行されます。 |
|
Camel 2.4: | |
|
|
Camel 2.4: |