179.11. エンドポイントを再利用し、実行時に計算されたさまざまな宛先に送信します

多くの異なる JMS 宛先にメッセージを送信する必要がある場合は、JMS エンドポイントを再利用して、メッセージヘッダーで実際の宛先を指定するのが理にかなっています。これにより、Camel は同じエンドポイントを再利用できますが、異なる宛先に送信できます。これにより、作成されるエンドポイントの数が大幅に削減され、メモリーとスレッドリソースが節約されます。

次のヘッダーで宛先を指定できます。

ヘッダータイプ説明

CamelJmsDestination

javax.jms.Destination

宛先オブジェクト。

CamelJmsDestinationName

String

宛先名。

たとえば、次のルートは、実行時に宛先を計算し、それを使用して JMS URL に表示される宛先をオーバーライドする方法を示しています。

from("file://inbox")
  .to("bean:computeDestination")
  .to("activemq:queue:dummy");

キュー名の dummy は単なるプレースホルダーです。JMS エンドポイント URL の一部として指定する必要がありますが、この例では無視されます。

computeDestination bean で、CamelJmsDestinationName ヘッダーを次のように設定して、実際の宛先を指定します。

public void setJmsHeader(Exchange exchange) {
   String id = ....
   exchange.getIn().setHeader("CamelJmsDestinationName", "order:" + id");
}

次に、Camel はこのヘッダーを読み取り、エンドポイントで設定されたものの代わりに宛先として使用します。したがって、この例では、id 値が 2 であると仮定して、Camel はメッセージを activemq:queue:order:2 に送信します。

CamelJmsDestination ヘッダーと CamelJmsDestinationName ヘッダーの両方が設定されている場合、CamelJmsDestination が優先されます。JMS プロデューサーは、CamelJmsDestination ヘッダーと CamelJmsDestinationName ヘッダーの両方を交換から削除し、作成された JMS メッセージに伝播しないことに注意してください。これは、ルートでの偶発的なループを回避するためです (メッセージが別の JMS エンドポイントに転送されるシナリオで)。