第25章 JMS
プロデューサーとコンシューマーの両方がサポート対象
このコンポーネントを使用すると、メッセージを JMS キューまたはトピックに送信 (またはそこから消費) できます。送信用の Spring の JmsTemplate
や消費用の MessageListenerContainer
など、Spring の JMS サポートを宣言型トランザクションに使用します。
Maven ユーザーは、このコンポーネントの pom.xml
に以下の依存関係を追加する必要があります。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jms</artifactId> <version>{CamelSBVersion}</version> <!-- use the same version as your Camel core version --> </dependency>
ActiveMQ の使用
Apache ActiveMQ を使用している場合は、ActiveMQ 用に最適化されている ActiveMQ コンポーネントを優先する必要があります。このページのすべてのオプションとサンプルは、ActiveMQ コンポーネントにも有効です。
トランザクションとキャッシング
パフォーマンスに影響を与える可能性があるため、JMS でトランザクションを使用している場合は、以下の トランザクションとキャッシュレベル セクションを参照してください。
JMS 経由のリクエスト/リプライ
Camel はパフォーマンスとクラスター化された環境を設定するための多くのオプションを提供するため、リクエスト/リプライに関する重要な注意事項については、このページのさらに下にあるセクション JMS を介したリクエスト - リプライ を必ずお読みください。
25.1. URI 形式
jms:[queue:|topic:]destinationName[?options]
ここで、destinationName
は JMS キューまたはトピック名です。デフォルトでは、destinationName
はキュー名として解釈されます。たとえば、キューに接続するには、FOO.BAR
を次のように使用します。
jms:FOO.BAR
必要に応じて、オプションの queue:
接頭辞を含めることができます。
jms:queue:FOO.BAR
トピックに接続するには、topic:
接頭辞を含める 必要 があります。たとえば、トピック Stocks.Prices
に接続するには、次を使用します。
jms:topic:Stocks.Prices
次の形式を使用して、クエリーオプションを URI に追加します。
?option=value&option=value&…
25.1.1. ActiveMQ の使用
JMS コンポーネントは、Spring 2 の JmsTemplate
を再利用してメッセージを送信します。これは非 J2EE コンテナーでの使用には理想的ではなく、通常、パフォーマンスの低下 を避けるために JMS プロバイダーでのキャッシュが必要になります。
Apache ActiveMQ をメッセージブローカーとして使用する場合は、次のいずれかを実行することをお勧めします。
- ActiveMQ を効率的に使用するためにすでに最適化されている ActiveMQ コンポーネントを使用する
-
ActiveMQ で
PoolingConnectionFactory
を使用します。
25.1.2. トランザクションとキャッシュレベル
メッセージを消費してトランザクションを使用している場合 (transacted=true
)、キャッシュレベルのデフォルト設定がパフォーマンスに影響を与える可能性があります。
XA トランザクションを使用している場合は、XA トランザクションが正しく機能しなくなる可能性があるため、キャッシュできません。
XA を使用して いない 場合は、cacheLevelName=CACHE_CONSUMER
を設定するなど、キャッシュを使用してパフォーマンスを高速化することを検討する必要があります。
cacheLevelName
のデフォルト設定は CACHE_AUTO
です。このデフォルトの自動モードはモードを検出し、それに応じてキャッシュレベルを設定します。
-
transacted=false
の場合はCACHE_CONSUMER
-
transacted=true
の場合はCACHE_NONE
したがって、デフォルト設定は保守的であると言えます。非 XA トランザクションを使用している場合は、cacheLevelName=CACHE_CONSUMER
の使用を検討してください。
25.1.3. 永続サブスクリプション
永続的なトピックサブスクリプションを使用する場合は、clientId
と durableSubscriptionName
の両方を指定する必要があります。clientId
の値は一意である必要があり、ネットワーク全体で単一の JMS 接続インスタンスによってのみ使用できます。この制限を回避するために、代わりに 仮想トピック を使用することをお勧めします。耐久性のあるメッセージングの詳細については、こちら をご覧ください。
25.1.4. メッセージヘッダーのマッピング
JMS 仕様では、メッセージヘッダーを使用する場合、ヘッダー名は有効な Java 識別子である必要があると規定されています。そのため、有効な Java 識別子になるようにヘッダーに名前を付けるようにしてください。これを行う利点の 1 つは、JMS セレクター内でヘッダーを使用できることです (その SQL92 構文では、ヘッダーの Java 識別子構文が義務付けられています)。
デフォルトでは、ヘッダー名をマッピングする単純な方法が使用されます。以下に示すように、ヘッダー名のドットとハイフンをすべて置き換え、ネットワーク経由で送信された JMS メッセージからヘッダー名が復元されたときに置き換えを元に戻す方法です。意味を確認するBean コンポーネントで呼び出すメソッド名が失われたり、ファイルコンポーネントのファイル名ヘッダーが失われたりすることはもうありません。
Camel でヘッダー名を受け入れるための現在のヘッダー名戦略は次のとおりです。
- ドットは `DOT` に置き換えられ、Camel がメッセージを消費すると置換が逆になります
- ハイフンは `HYPHEN` に置き換えられ、Camel がメッセージを消費すると置換が逆になります
JMS エンドポイントでさまざまなプロパティーを設定できます。これらのプロパティーは、JMSConfiguration
オブジェクトのプロパティーにマップされます。
Spring JMS へのマッピング
これらのプロパティーの多くは、Camel がメッセージの送受信に使用する Spring JMS のプロパティーにマップされます。したがって、関連する Spring ドキュメントを参照することで、これらのプロパティーに関する詳細情報を取得できます。