169.9. エンドポイントを再利用してランタイム時に計算される異なる宛先に送信する
多くの異なる JMS 宛先にメッセージを送信する必要がある場合は、JMS エンドポイントを再利用し、メッセージヘッダーに実際の宛先を指定することが理にかなっています。これにより、Camel は同じエンドポイントを再利用できますが、異なる宛先に送信することができます。これにより、メモリーやスレッドリソースで作成されたエンドポイントの数が大幅に削減されます。
以下のヘッダーで宛先を指定できます。
| ヘッダー | Type | 説明 |
|---|---|---|
|
|
| 宛先オブジェクト。 |
|
|
| 宛先名。 |
たとえば、以下のルートはランタイム時に宛先を計算し、これを使用して JMS URL に表示される宛先を上書きする方法を示しています。
from("file://inbox")
.to("bean:computeDestination")
.to("activemq:queue:dummy");
キュー名の ダミー はプレースホルダーです。JMS エンドポイント URL の一部として指定する必要がありますが、この例では無視されます。
computeDestination Bean で、以下のように CamelJmsDestinationName ヘッダーを設定して、実際の宛先を指定します。
public void setJmsHeader(Exchange exchange) {
String id = ....
exchange.getIn().setHeader("CamelJmsDestinationName", "order:" + id");
}
Camel はこのヘッダーを読み取り、エンドポイントに設定されたヘッダーの代わりに宛先として使用します。この例では、Camel はメッセージを activemq:queue:order:2 に送信します。
CamelJmsDestination と ヘッダーの両方が設定されている場合、CamelJmsDestination NameCamelJmsDestination が優先されます。JMS プロデューサーは、エクスチェンジから CamelJmsDestination および CamelJmsDestinationName ヘッダーの両方を削除し、ルートで誤ってループを回避するために作成された JMS メッセージに伝播されないことに注意してください(メッセージが別の JMS エンドポイントに転送されるシナリオ)。