269.6. サンプル

ルーティングキー B を持つエクスチェンジ A にバインドされたキューからメッセージを受信するには以下のようにします。

from("rabbitmq:A?routingKey=B")

自動応答が無効になっている単一のスレッドでキューからメッセージを受信するには以下のようにします。

from("rabbitmq:A?routingKey=B&threadPoolSize=1&autoAck=false")

C というエクスチェンジにメッセージを送信するには以下のようにします。

to("rabbitmq:C")

ヘッダーエクスチェンジとキューの宣言

from("rabbitmq:ex?exchangeType=headers&queue=q&bindingArgs=#bindArgs")

bindArgs という ID の Map<String, Object> をレジストリーに配置します。

たとえば、Spring にメソッドを宣言します

@Bean(name="bindArgs")
public Map<String, Object> bindArgsBuilder() {
    return Collections.singletonMap("foo", "bar");
}

269.6.1. エクスチェンジ間のルーティングの問題 (Camel 2.20.x 以前)

たとえば、次の例に示すように、ある Rabbit エクスチェンジから別の Rabbit エクスチェンジにメッセージをルーティングしたい場合は、foo → bar とします。

from("rabbitmq:foo")
  .to("rabbitmq:bar")

次に、Camel がメッセージを自分自身にルーティングすることに注意してください (例: foo → foo)。では、それはなぜでしょうか。これは、メッセージを受信するコンシューマー (送信元など) が、メッセージヘッダーの rabbitmq.EXCHANGE_NAME にエクスチェンジの名前 (foo など) を提供するためです。Camel プロデューサーがメッセージを bar に送信する場合、ヘッダー rabbitmq.EXCHANGE_NAME はこれをオーバーライドし、代わりにメッセージを foo に送信します。

これを回避するには、次のいずれかを行う必要があります。

  • ヘッダーを削除します。
from("rabbitmq:foo")
  .removeHeader("rabbitmq.EXCHANGE_NAME")
  .to("rabbitmq:bar")
  • または、プロデューサーで bridgeEndpoint モードをオンにします。
from("rabbitmq:foo")
  .to("rabbitmq:bar?bridgeEndpoint=true")

Camel 2.21 以降ではこれが改善され、エクスチェンジ間で簡単にルーティングできるようになりました。ヘッダー rabbitmq.EXCHANGE_NAME は、宛先エクスチェンジをオーバーライドするためにプロデューサーによって使用されなくなりました。代わりに、新しいヘッダー rabbitmq.EXCHANGE_OVERRIDE_NAME を使用して、別のエクスチェンジに送信できます。たとえば、cheese エクスチェンジに送信するには、次のことができます

from("rabbitmq:foo")
  .setHeader("rabbitmq.EXCHANGE_OVERRIDE_NAME", constant("cheese"))
  .to("rabbitmq:bar")