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: |