169.12. JMS での request-reply
Camel は JMS 経由での Request Reply をサポートします。そこでは、JMS キューへメッセージを送信するときに、エクスチェンジの MEP は InOut である必要があります。
Camel は、パフォーマンスやクラスター環境に影響する JMS 上でリクエストや応答を設定する数多くのオプションを提供しています。以下の表は、オプションの概要を示しています。
| オプション | パフォーマンス | Cluster | 説明 |
|---|---|---|---|
|
| 高速 | 対応 |
一時キューはリプライキューとして使用され、Camel によって自動作成されます。これを使用するには、reclaimTo キュー名を指定し ません。また、任意で |
|
| slow | 対応 |
共有永続キューはリプライキューとして使用されます。キューは事前に作成する必要がありますが、一部のブローカーは Apache ActiveMQ などの場で作成できます。これを使用するには、replyTo キュー名を指定する必要があります。また、任意で |
|
| 高速 | No(*Yes) |
排他的永続キューはリプライキューとして使用されます。キューは事前に作成する必要がありますが、一部のブローカーは Apache ActiveMQ などの場で作成できます。これを使用するには、replyTo キュー名を指定する必要があります。さらに、ReplyToType=Exclusive を設定して、 |
|
| 高速 | 対応 |
Camel 2.10.3: 使用中の同時メッセージリスナーを使用して、リプライメッセージを同時に処理できます。 |
|
| 高速 | 対応 |
Camel 2.10.3: 使用中の同時メッセージリスナーを使用して、リプライメッセージを同時に処理できます。 |
JmsProducer は InOut を検出し、使用されるリプライ宛先を持つ JMSReplyTo ヘッダーを提供します。デフォルトでは、Camel は一時キューを使用しますが、エンドポイントで replyTo オプションを使用して、固定応答キューを指定できます(固定応答キューの詳細は以下を参照してください)。
Camel はリプライキューをリッスンするコンシューマーを自動的に設定するため、何もする必要はあり ません。
このコンシューマーは、返信をリッスンする Spring DefaultMessageListenerContainer です。ただし、同時コンシューマーは 1 に固定されています。
つまり、返信を処理する 1 つのスレッドしかないため、返信は順番に処理されます。応答の処理速度が速い場合は、同時実行を使用する必要があります。ただし、concurrentConsumer オプション は使用しません。以下のルートのように、代わりに Camel DSL からの スレッド を使用する必要があります。
スレッドを使用する代わりに、Camel 2.10.3 以上を使用する場合は concurrentConsumers オプションを使用します。詳細は以下を参照してください。
from(xxx)
.inOut().to("activemq:queue:foo")
.threads(5)
.to(yyy)
.to(zzz);
from(xxx)
.inOut().to("activemq:queue:foo")
.threads(5)
.to(yyy)
.to(zzz);
このルートでは、5 つのスレッドを持つスレッドプールを使用して返信を非同期でルーティングするよう Camel に指示します。
Camel 2.10.3 以降では、concurrentConsumers オプションおよび maxConcurrentConsumers オプションを使用して、同時スレッドを使用するようにリスナーを設定できるようになりました。これにより、以下のように Camel で簡単に設定することができます。
from(xxx)
.inOut().to("activemq:queue:foo?concurrentConsumers=5")
.to(yyy)
.to(zzz);
from(xxx)
.inOut().to("activemq:queue:foo?concurrentConsumers=5")
.to(yyy)
.to(zzz);