63.11. エンドポイントを再利用し、実行時に計算されたさまざまな宛先に送信します
多数の異なる RabbitMQ 交換にメッセージを送信する必要がある場合は、エンドポイントを再利用し、メッセージヘッダーで実際の宛先を指定する必要があります。これにより、Camel は同じエンドポイントを再利用できますが、異なるエクスチェンジに送信できます。これにより、作成されるエンドポイントの数が大幅に削減され、メモリーとスレッドリソースが節約されます。
ヘッダーで動的宛先を指定するよりも、toD を使用する方が簡単です。
次のヘッダーを使用して指定できます。
ヘッダー | タイプ | 説明 |
---|---|---|
|
| エクスチェンジ名。 |
|
| ルーティングキー。 |
たとえば、次のルートは、実行時に宛先を計算し、それを使用してエンドポイント URL に表示される交換をオーバーライドする方法を示しています。
from("file://inbox") .to("bean:computeDestination") .to("spring-rabbitmq:dummy");
from("file://inbox")
.to("bean:computeDestination")
.to("spring-rabbitmq:dummy");
交換名 dummy
は単なるプレースホルダーです。これは RabbitMQ エンドポイント URL の一部として指定する必要がありますが、この例では無視されます。
computeDestination
Bean で、次のように CamelRabbitmqExchangeOverrideName
ヘッダーを設定して実際の宛先を指定します。
public void setExchangeHeader(Exchange exchange) { String region = .... exchange.getIn().setHeader("CamelSpringRabbitmqExchangeOverrideName", "order-" + region); }
public void setExchangeHeader(Exchange exchange) {
String region = ....
exchange.getIn().setHeader("CamelSpringRabbitmqExchangeOverrideName", "order-" + region);
}
Camel はこのヘッダーを読み取り、エンドポイントで設定された名前の代わりに交換名として使用します。したがって、この例では、region
値が emea
であると仮定して、Camel はメッセージを spring-rabbitmq:order-emea
に送信します。
プロデューサは、ルート内での偶発的なループ (メッセージが別の RabbitMQ エンドポイントに転送されるシナリオ) を避けるために、交換から CamelSpringRabbitmqExchangeOverrideName
ヘッダーと CamelSpringRabbitmqRoutingOverrideKey
ヘッダーの両方を削除し、作成された Rabbitmq メッセージにそれらを伝播しません。