第84章 JMS


JMS Component

ActiveMQ の使用
Apache ActiveMQ を使用している場合は、ActiveMQ で最適化されているため、ActiveMQ コンポーネントを使用することが推奨されます。このページのすべてのオプションとサンプルも ActiveMQ コンポーネントに対して有効です。
トランザクションおよびキャッシュ
JMS でトランザクションを使用している場合は、パフォーマンスに影響する可能性があるため、以下のトランザクション レベルとキャッシュ レベルを参照してください。
JMS でのリクエスト/応答
Camel にはパフォーマンスおよびクラスター環境に設定するオプションを多数提供するため、このページの Request-reply over JMS セクションは、リクエスト/リプライに関する重要なメモについて、さらに JMS で確認してください。
JMS コンポーネントを使用すると、JMS キューまたはトピックとの間でメッセージを送信(または消費)できます。宣言的トランザクションには Spring の JMS サポートを使用し、送信に Spring の JmsTemplate を使用し、消費するために MessageListenerContainer を使用します。
Maven ユーザーは、このコンポーネントの pom.xml に以下の依存関係を追加する必要があります。
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jms</artifactId>
    <version>2.17.0.redhat-630xxx</version>
    <!-- use the same version as your Camel core version -->
</dependency>
Copy to Clipboard Toggle word wrap

Camel on EAP デプロイメント

このコンポーネントは、Red Hat JBoss Enterprise Application Platform (JBoss EAP) コンテナー上で簡素化されたデプロイメントモデルを提供する Camel on EAP (Wildfly Camel) フレームワークによってサポートされます。このモデルの詳細は、Deploying into a Web Server の Apache Camel on JBoss EAP の章を参照してください

URI 形式

jms:[queue:|topic:]destinationName[?options]
Copy to Clipboard Toggle word wrap
destinationName は JMS キューまたはトピック名です。デフォルトでは、destinationName はキュー名として解釈されます。たとえば、キューに接続するには、FOO.BAR を次のように使用します。
jms:FOO.BAR
Copy to Clipboard Toggle word wrap
必要に応じて、オプションの queue: 接頭辞を含めることができます。
jms:queue:FOO.BAR
Copy to Clipboard Toggle word wrap
トピックに接続するには、topic: 接頭辞を含める 必要があり ます。たとえば、Stocks.Prices トピックに接続するには、以下を使用します。
jms:topic:Stocks.Prices
Copy to Clipboard Toggle word wrap
?option=value&option=value&.. という形式を使用して、URI にクエリーオプションを追加します。

ActiveMQ の使用

JMS コンポーネントは、メッセージ送信に Spring 2 の JmsTemplate を再利用します。これは、J2EE 以外のコンテナーでの使用に理想的ではなく、パフォーマンスが低下 するのを防ぐために、通常 JMS プロバイダーでキャッシュを必要とします。
Apache ActiveMQ をメッセージブローカーとして使用する場合は、以下のいずれかを推奨します。
  • ActiveMQ を効率的に使用するように最適化されている ActiveMQ コンポーネントを使用する
  • ActiveMQ の PoolingConnectionFactory を使用します。

トランザクションおよびキャッシュレベル

メッセージを使用し、トランザクション(transacted=true)を使用している場合、キャッシュレベルのデフォルト設定はパフォーマンスに影響を与える可能性があります。XA トランザクションを使用している場合は、XA トランザクションが適切に機能しなくなる可能性があるため、キャッシュできません。
XA を使用してい ない 場合は、cacheLevelName=CACHE_CONSUMER の設定など、パフォーマンスの速度を上げるようにキャッシュを検討してください。
Camel 2.7.x より、cacheLevelName のデフォルト設定は CACHE_CONSUMER です。cacheLevelName=CACHE_NONE を明示的に設定する必要があります。Camel 2.8 以降では、cacheLevelName のデフォルト設定は CACHE_AUTO です。このデフォルトは、モードを自動的に検出し、それに応じてキャッシュレベルを設定します。
  • CACHE_CONSUMER = if transacted=false
  • CACHE_NONE = if transacted=true
そのため、デフォルト設定が保存されているとすることができます。非 XA トランザクションを使用している場合は、cacheLevelName=CACHE_CONSUMER の使用を検討してください。

永続サブスクリプション

永続トピックサブスクリプションを使用する場合は、clientIddurableSubscriptionName の両方を指定する必要があります。clientId の値は一意でなければならず、ネットワーク全体の単一の JMS 接続インスタンスによってのみ使用できます。この制限を回避するために、代わり に仮想トピック を使用することが推奨されます。ここ での永続メッセージングに関する詳細な背景。

メッセージヘッダーのマッピング

メッセージヘッダーを使用する場合、JMS 仕様ではヘッダー名が有効な Java 識別子である必要があります。そのため、ヘッダーに有効な Java 識別子に名前を付けてみてください。これを行う利点の 1 つは、JMS セレクター内でヘッダーを使用できることです(SQL92 構文でヘッダーの Java 識別子構文が義務付けられます)。
デフォルトでは、ヘッダー名をマッピングする簡単なストラテジーが使用されます。ストラテジーは、以下に示すようにヘッダー名のドットとハイフンを置き換え、ヘッダー名がネットワーク経由で送信される JMS メッセージから復元されるときに置換を元に戻すことです。意味を確認するBean コンポーネントで呼び出すメソッド名を失うことなく、File Component の filename ヘッダーを失うことはありません。
Camel でヘッダー名を受け入れる現在のヘッダー名ストラテジーは次のとおりです。
  • ドットは \_DOT\_ に置き換えられ、Camel がメッセージを消費すると置換が逆になります。
  • ハイフンは \_HYPHEN\_ に置き換えられ、Camel がメッセージを消費すると置換が逆になります。

オプション

JMSConfiguration POJO でプロパティーにマップする JMS エンドポイントで多くの異なるプロパティーを設定できます。
Spring JMS へのマッピング
これらのプロパティーの多くは、Camel がメッセージの送受信に使用する Spring JMS のプロパティーにマップされます。そのため、関連する Spring ドキュメント を参照して、これらのプロパティーの詳細情報を取得できます。
オプションは 2 つのテーブルに分割され、最初のテーブルは使用される最も一般的なオプションになります。後者には残りが含まれます。

最も一般的に使用されるオプション

Expand
オプション デフォルト値 説明
clientId null 使用する JMS クライアント ID を設定します。この値は、指定されている場合は一意である必要があり、単一の JMS 接続インスタンスでのみ使用できることに注意してください。通常、これは永続トピックサブスクリプションにのみ必要です。代わりに 仮想トピックを使用することも できます。
concurrentConsumers 1 同時コンシューマーのデフォルトの数を指定します。Camel 2.10.3 以降では、JMS でリクエスト/リプライを行うときにこのオプションを使用することもできます。スレッドの動的なスケールアップ/ダウンを制御するには、maxMessagesPerTask オプションも参照してください。
replyToConcurrentConsumers 1 Camel 2.16: JMS 上でリクエスト/リプライを行う際の同時コンシューマーのデフォルトの数を指定します。
disableReplyTo false true の場合、プロデューサーは JMSReplyTo ヘッダーが送信され、InOnly の場合のように抑制されない例外を持つ InOnly エクスチェンジのように動作します。InOnly と同様に、プロデューサーは応答を待ちません。このフラグを持つコンシューマーは InOnly のように動作します。この機能は、InOut 要求を別のキューにブリッジするために使用できます。これにより、他のキューのルートが応答を直接元の JMSReplyTo に送信することができます。
durableSubscriptionName null 永続トピックサブスクリプションを指定するための永続サブスクライバー名。clientId オプションも設定 する必要があり ます。
maxConcurrentConsumers 1 同時コンシューマーの最大数を指定します。Camel 2.10.3 以降では、JMS でリクエスト/リプライを行うときにこのオプションを使用することもできます。スレッドの動的なスケールアップ/ダウンを制御するには、maxMessagesPerTask オプションも参照してください。スレッドをスケールダウンするには、maxMessagesPerTask オプションを 0 より大きい整数に設定する必要があります。そうしないと、スレッドの数はシャットダウンまで maxConcurrentConsumers に残ります。
replyToMaxConcurrentConsumers 1 Camel 2.16: JMS 上でリクエスト/リプライを行う際の同時コンシューマーの最大数を指定します。スレッドの動的なスケールアップ/ダウンを制御するオプションも参照してください。maxMessagesPerTask
maxMessagesPerTask -1 タスクごとのメッセージ数。\-1 は無制限です。同時コンシューマーの範囲(例:min < max)を使用する場合は、このオプションを使用して値を 100 に設定し、必要な作業が少ない場合にコンシューマーを縮小する方法を制御できます。
preserveMessageQos false JMS エンドポイントの QoS 設定の代わりに、メッセージで指定された QoS 設定を使用してメッセージを送信する場合は true に設定します。以下の 3 つのヘッダーは JMSPriorityJMSDeliveryMode、および JMSExpiration とみなされます。提供できるのはすべてまたは一部のみです。指定のない場合は、Camel はフォールバックしてエンドポイントからの値を使用します。そのため、このオプションを使用すると、ヘッダーは エンドポイントからの値を上書きします。これとは対照的に、explicitQosEnabled オプションは、エンドポイントに設定されたオプションのみを使用し、メッセージヘッダーからの値は使用しません。
replyTo null 明示的な ReplyTo 宛先を提供し ます。これは、Message.getJMSReplyTo ()の受信値を上書きします。JMS 経由で リクエスト応答 を行う場合は、以下の JMS でさらに Request-reply で確認して詳細を確認し、replyToType オプションも 必ず 読んでください。
replyToOverride null Camel 2.15: JMS メッセージの明示的な ReplyTo 宛先を提供します。これは replyTo の設定を上書きします。メッセージをリモートキューへ転送し、ReplyTo 宛先からリプライメッセージを受信する場合に便利です。
replyToType null Camel 2.9: JMS 上でリクエスト/リプライを行うときに、replyTo キューに使用するストラテジーを明示的に指定できます。使用できる値は、一時的な共有、または 排他的 です。デフォルトでは、Camel は一時キューを使用します。ただし、replyTo が設定されている場合は、デフォルトで Shared が使用されます。このオプションを使用すると、共有キューの代わりに排他的キューを使用できます。詳細は、以下を参照してください。特に、クラスター環境で実行されたかどうかに関する注意点と、Shared 応答キューのパフォーマンスは、alternative Temporary および Exclusive よりも低いという事実を参照してください。
requestTimeout 20000 プロデューサーのみ: InOut Exchange Pattern (ミリ秒単位)を使用する場合の応答を待機するタイムアウト。デフォルトは 40 秒です。Camel 2.13/2.12.3 以降では、ヘッダー CamelJmsRequestTimeout を追加してこのエンドポイントが設定されたタイムアウト値を上書きし、メッセージごとに個別のタイムアウト値を設定できます。詳細は、About time to live のセクションを参照してください。requestTimeoutCheckerInterval オプションも参照してください。
selector null ブローカー内のメッセージのフィルターに使用される SQL 92 述語である JMS セレクターを設定します。Camel 2.3.0 よりも前のバージョンでは、= などの特殊文字をエンコードしないといけない場合があります。Camel ConsumerTemplate ではこのオプションをサポートしません。
timeToLive null メッセージを送信する場合は、メッセージの存続期間(ミリ秒単位)を指定します。詳細は、About time to live のセクションを参照してください。
transacted false InOnly Exchange Pattern を使用したメッセージの送受信にトランザクションモードを使用するかどうかを指定します。
testConnectionOnStartup false Camel 2.1: 起動時に接続をテストするかどうかを指定します。これにより、Camel が起動すると、すべての JMS コンシューマーが JMS ブローカーに有効な接続を持つようになります。接続を付与できない場合、Camel は起動時に例外を出力します。これにより、Camel が失敗したコネクションで開始されなくなります。Camel 2.8 以降では、JMS プロデューサーもテストされています。

その他のすべてのオプション

Expand
オプション デフォルト値 説明
acceptMessagesWhileStopping false 停止中にコンシューマーがメッセージを受け入れるかどうかを指定します。キューに送信されたメッセージは、実行時に JMS ルートを開始および停止する場合、このオプションを有効にすることを検討してください。このオプションが false で、JMS ルートを停止すると、メッセージが拒否され、JMS ブローカーは再配信を試行する必要がありますが、再度拒否され、最終的にメッセージは JMS ブローカーのデッドレターキューに移動される可能性があります。これを回避するには、このオプションを有効にすることが推奨されます。
acknowledgementModeName AUTO_ACKNOWLEDGE SESSION_TRANSACTEDCLIENT_ACKNOWLEDGEAUTO_ACKNOWLEDGEDUPS_OK_ACKNOWLEDGEのいずれかである JMS の確認名
acknowledgementMode \-1 整数として定義される JMS 確認モード。ベンダー固有の拡張機能を確認モードに設定できます。通常のモードでは、代わりに acknowledgementModeName を使用することが推奨されます。
allowNullBody true Camel 2.9.3/2.10.1: ボディーのないメッセージの送信を許可するかどうか。このオプションが false でメッセージボディーが null の場合、JMSException が出力されます。
alwaysCopyMessage false true の場合、送信のためにプロデューサーに渡されるときに、Camel は常にメッセージの JMS メッセージコピーを作成します。replyToDestinationSelectorName が設定されている場合など、一部の状況でメッセージのコピーが必要になる場合(誤って Camel は replyToDestinationSelectorName が設定されている場合、Camel は alwaysCopyMessage オプションを true に設定します)
asyncConsumer false Camel 2.9: JmsConsumerエクスチェンジ非同期的 に処理するかどうか。有効にすると、JmsConsumer は JMS キューから次のメッセージを選択し、以前のメッセージは非同期で処理されます( Asynchronous Routing Engine)。つまり、メッセージは 100% ではなく、順番に処理できます。無効(デフォルト)の場合、JmsConsumer が JMS キューから次のメッセージを取得する前に、エクスチェンジ は完全に処理されます。トランザクションが有効になっている場合は、トランザクションを同期的に実行する必要があるため、asyncConsumer=true は非同期的に実行しません(Camel 3.0 は非同期トランザクションをサポートする可能性があるため)。
asyncStartListener false Camel 2.10: ルートの開始時に JmsConsumer メッセージリスナーを非同期に起動するかどうか。たとえば、JmsConsumer がリモート JMS ブローカーへの接続を取得できない場合、再試行中やフェイルオーバー中にブロックされる可能性があります。これにより、ルートの開始時に Camel がブロックされます。このオプションを true に設定すると、ルートの起動を許可します。一方、JmsConsumer は非同期モードで専用のスレッドを使用して JMS ブローカーに接続します。このオプションを使用する場合は、接続を確立できない場合は例外が WARN レベルでログに記録され、コンシューマーはメッセージを受信できず、ルートを再起動して再試行できます。
asyncStopListener false Camel 2.10: ルートを停止するときに JmsConsumer メッセージリスナーを非同期に停止するかどうか。
autoStartup true コンシューマーコンテナーを自動起動させるかどうかを指定します。
cacheLevelName
CACHE_AUTO (Camel >= 2.8.0) CACHE_CONSUMER (Camel <= 2.7.1)
基礎となる JMS リソースの名前でキャッシュレベルを設定します。使用できる値は、CACHE_AUTOCACHE_CONNECTIONCACHE_CONSUMERCACHE_NONE、および CACHE_SESSION です。Camel 2.8 以降のデフォルト設定は CACHE_AUTO です。Camel 2.7.1 以前では、デフォルトは CACHE_CONSUMER です。詳細は、Spring のドキュメント および トランザクションキャッシュレベル を 参照してください。
cacheLevel 基礎となる JMS リソースの ID でキャッシュレベルを設定します。詳細は、cacheLevelName オプションを参照してください。
consumerType デフォルト 使用するコンシューマータイプ。SimpleDefault、または Custom のいずれかです。コンシューマータイプは、使用する Spring JMS リスナーを決定します。デフォルト では org.springframework.jms.listener.DefaultMessageListenerContainer を使用します。Simpleorg.springframework.jms.listener.SimpleMessageListenerContainer を使用します。Custom が指定されている場合、messageListenerContainerFactoryRef オプションで定義される MessageListenerContainerFactory は、使用する org.springframework.jms.listener.AbstractMessageListenerContainer を決定します(Camel 2.11 および 2.10.2 の新しいオプション)。このオプションは、Camel 2.7 および 2.8 で一時的に削除されました。ただし、Camel 2.9 以降は再び追加されました。
connectionFactory null 指定がない場合は、listenerConnectionFactory および templateConnectionFactory に使用するデフォルトの JMS 接続ファクトリー。
defaultTaskExecutorType (説明を参照) Camel 2.10.4: プロデューサーエンドポイントのコンシューマーエンドポイントと ReplyTo コンシューマーの両方に対して、DefaultMessageListenerContainer で使用するデフォルトの TaskExecutor タイプを指定します。使用できる値: SimpleAsync (Spring の SimpleAsyncTaskExecutorを使用)または ThreadPool (最適な値で Spring の ThreadPoolTaskExecutor を使用)- キャッシュされた threadpool-like を使用します。設定されていない場合、デフォルトで以前の動作に設定されます。これはコンシューマーエンドポイントにキャッシュされたスレッドプールを使用し、応答コンシューマーに SimpleAsync を使用します。ThreadPool の使用は、同時コンシューマーを動的に増減することで、Elastic 設定でスレッドゴミ箱を減らすことが推奨されます。
deliveryMode
null
Camel 2.12.2/2.13: 使用する配信モードを指定します。Possibles 値は、javax.jms.DeliveryMode で定義される値になります。
deliveryPersistent true 永続的な配信がデフォルトで使用されるかどうかを指定します。
destination null このエンドポイントで使用する JMS Destination オブジェクトを指定します。
destinationName null このエンドポイントで使用する JMS 宛先名を指定します。
destinationResolver null 独自のリゾルバーを使用できるプラグ可能な org.springframework.jms.support.destination.DestinationResolver。JNDI レジストリーで実際の宛先を検索するなど。
disableTimeToLive false camel 2.8: このオプションを使用して、時間のライブを無効にします。たとえば、JMS でリクエスト/リプライを行う場合、Camel はデフォルトで requestTimeout 値を送信されるメッセージに対して存続する時間として使用します。この問題は、送信者と受信者のシステムでクロックを同期して同期する必要があることです。これは必ずしも簡単にアーカイブできるとは限りません。そのため、disableTimeToLive=true を使用して、送信されたメッセージに time to live 値を設定でき ません。その後、メッセージは受信側システムで期限切れになりません。詳細は、About time to live のセクションを参照してください。
eagerLoadingOfProperties false JMS プロパティーが必要ないため、メッセージ受信直後に JMS プロパティーの Eager 読み込みを有効にします。ただし、この機能は基礎となる JMS プロバイダーの問題や JMS プロパティーの使用の初期段階でキャッチすることがあります。この機能はテスト目的でも使用でき、JMS プロパティーが正しく認識および処理されるようにします。
exceptionListener null 基礎となる JMS 例外を通知する JMS 例外リスナーを指定します。
errorHandler null >Camel 2.8.2、2.9: メッセージの処理中に検出されない例外が発生した場合に org.springframework.util.ErrorHandler を呼び出し ます。デフォルトでは、errorHandler が設定されていない場合、これらの例外は WARN レベルでログに記録されます。Camel 2.9.1 以降、以下の 2 つのオプションを使用して、ロギングレベルおよびスタックトレースをログに記録するかどうかを設定できます。これにより、カスタム errorHandler をコーディングする必要がなく、設定が非常に簡単になります。
errorHandlerLoggingLevel WARN Camel 2.9.1: キャッチされない例外をログに記録するために、デフォルトの errorHandler ロギングレベルを設定できます。
errorHandlerLogStackTrace true Camel 2.9.1: デフォルトの errorHandler で、スタックトレースをログに記録するかどうかを制御できます。
explicitQosEnabled false メッセージの送信時に deliveryModepriority、または timeToLive のサービス品質を使用する場合を設定します。このオプションは Spring の JmsTemplate に基づいています。deliveryMode オプション、priority オプション、および timeToLive オプションが現在のエンドポイントに適用されます。これは、メッセージ粒度で動作し、Camel In メッセージヘッダーからのみ QoS プロパティーを読み取る preserveMessageQos オプションとは対照的です。
exposeListenerSession true メッセージを消費するときにリスナーセッションを公開するかどうかを指定します。
forceSendOriginalMessage false >Camel 2.7: mapJmsMessage=false を使用すると、ルート中にヘッダー(取得または設定)にアクセスすると、Camel は新しい JMS 宛先に送信する新しい JMS メッセージを作成します。このオプションを true に設定すると、Camel は受信された元の JMS メッセージを送信するようにします。
idleTaskExecutionLimit 1 実行内でメッセージを受信せずに、受信タスクのアイドル実行の制限を指定します。この制限に達すると、タスクはシャットダウンし、他の実行中のタスクまで受信したままになります(動的スケジューリングの場合は、maxConcurrentConsumers の設定を参照してください)。
idleConsumerLimit 1 Camel 2.8.2、2.9: 指定した時間にアイドル状態にできるコンシューマーの数の制限を指定します。
includeSentJMSMessageID false Camel 2.10.3: InOnly (例:fire および forget)を使用して JMS 宛先に送信する場合にのみ適用されます。このオプションを有効にすると、メッセージが JMS 宛先に送信されたときに JMS クライアントによって使用される実際の JMSMessageID で Camel Exchange を補完します。
includeAllJMSXProperties false Camel 2.11.2/2.12: JMS から Camel Message にマッピングする際にすべての JMSXxxx プロパティーを含めるかどうか。これを true に設定すると、JMSXAppIDJMSXUserID などのプロパティーが含まれます。注記: カスタムの headerFilterStrategy を使用している場合、このオプションは適用されません。
jmsMessageType null JMS メッセージの送信に特定の javax.jms.Message 実装の使用を強制できます。使用できる値は、バイトマップオブジェクトストリームテキストです。デフォルトでは、Camel は In ボディータイプから使用する JMS メッセージタイプを決定します。このオプションを使用すると指定できます。
jmsKeyFormatStrategy default JMS 仕様に準拠できるように、JMS キーをエンコードおよびデコードするためのプラグ可能な戦略。Camel は、追加設定なしで、defaultpassthrough の 2 つの実装を提供します。デフォルト のストラテジーは、ドットとハイフン(. および \-)を安全にマーシャリングします。パススルー ストラテジーは、キーをそのまま残します。JMS ヘッダーキーに不正な文字が含まれているかどうかは問題にならない JMS ブローカーに使用できます。org.apache.camel.component.jms.JmsKeyFormatStrategy の独自の実装を提供し、\# 表記を使用して参照できます。
jmsOperations null org.springframework.jms.core.JmsOperations インターフェイスの独自の実装を使用できます。Camel はデフォルトで JmsTemplate を使用します。テスト目的に使用できますが、Spring API ドキュメントに記載されているあまり使用されません。
lazyCreateTransactionManager true true の場合、オプション transacted=true 時に transactionManager が注入されない場合、Camel は JmsTransactionManager を作成します。
listenerConnectionFactory null メッセージの消費に使用される JMS 接続ファクトリー。
mapJmsMessage true Camel が受信した JMS メッセージを javax.jms.TextMessage などの適切なペイロードタイプに自動的にマップするかどうかを指定 ます。詳細は、マッピングの仕組みについて以下のセクションを参照してください。
maximumBrowseSize \-1 Browse または JMX API を使用してエンドポイントを参照する際に、最もフェッチされたメッセージの数を制限します。
messageConverter null カスタムの Spring org.springframework.jms.support.converter.MessageConverter を使用して、javax.jms.Message のマッピング方法や、javax.jms.Message からのマッピング方法を制御することができます。
messageIdEnabled true 送信時に、メッセージ ID を追加するかどうかを指定します。
messageListenerContainerFactoryRef null Camel 2.10.2: メッセージの消費に使用する org.springframework.jms.listener.AbstractMessageListenerContainer を決定するために使用される MessageListenerContainerFactory のレジストリー ID。これを設定すると、consumerType が自動的に Custom に設定されます。
messageTimestampEnabled true メッセージの送信時にタイムスタンプをデフォルトで有効にするかどうかを指定します。
password null コネクターファクトリーのパスワード。
priority 4 1 より大きい値は、送信時のメッセージの優先度を指定します(0 は最も低い優先度で、9 は最も高い値です)。このオプションを有効にするには、explicitQosEnabled オプションも有効にする 必要 があります。
pubSubNoLocal false 独自の接続によってパブリッシュされたメッセージの配信を禁止するかどうかを指定します。
receiveTimeout 1000 メッセージの受信のタイムアウト(ミリ秒単位)。
recoveryInterval 5000 リカバリーの試行の間隔を指定します。つまり、接続が更新されるタイミング(ミリ秒単位)を指定します。デフォルトは 5000 ミリ秒(5 秒)です。
replyToSameDestinationAllowed false Camel 2.16: コンシューマーのみ:JMS コンシューマーが消費に使用するのと同じ宛先にリプライメッセージを送信できるかどうか。これにより、同じメッセージを消費して自身に送信することで、無限ループを防ぐことができます。
replyToCacheLevelName CACHE_CONSUMER camel 2.9.1: JMS 上でリクエスト/リプライを行うときに応答コンシューマーの名前でキャッシュレベルを設定します。このオプションは、(一時的ではなく)Fixed reply queue を使用する場合にのみ適用されます。Camel はデフォルトで を使用します。排他的または共有 w/ replyToSelectorNameCACHE_CONSUMER を使用します。replyToSelectorName なしで共有される CACHE_SESSION。IBM WebSphere などの一部の JMS ブローカーは、replyToCacheLevelName=CACHE_NONE を設定して機能させる必要がある場合があります。
replyToDestinationSelectorName null 固定名を使用して JMS セレクターを設定し、共有キューの使用時に(つまり一時的な応答キューを使用していない場合)、他の者からのリプライをフィルターリングできます。
replyToDeliveryPersistent true 応答に永続配信をデフォルトで使用するかどうかを指定します。
requestTimeoutCheckerInterval 1000 Camel 2.9.2: JMS でリクエスト/リプライを行うときに Camel がタイムアウトした エクスチェンジをチェックする頻度を設定します。デフォルトの Camel は 1 秒あたり 1 回チェックします。ただし、タイムアウトの発生時に迅速な反応が必要な場合は、この間隔を下げてより頻繁にチェックできます。タイムアウトは、requestTimeout オプションによって決定されます。
subscriptionDurable false @非推奨: durableSubscriptionName および clientId を指定するとデフォルトで有効になります。
taskExecutor null メッセージを消費するためにカスタムタスクエグゼキューターを指定できます。
taskExecutorSpring2 null Camel 2.6: Camel で Spring 2.x を使用する場合に使用する。メッセージを消費するためにカスタムタスクエグゼキューターを指定できます。
templateConnectionFactory null メッセージの送信に使用される JMS 接続ファクトリー。
transactedInOut false @非推奨: InOut Exchange パターン を使用してメッセージを送信するためにトランザクションモードを使用するかどうかを指定し ます。プロデューサーエンドポイントにのみ適用されます。詳細は 、Transacted Consumption の有効化 を 参照してください。
transactionManager null 使用する Spring トランザクションマネージャー。
transactionName "JmsConsumer[destinationName]" 使用するトランザクションの名前。
transactionTimeout null トランザクションモードを使用する場合のトランザクションのタイムアウト値(秒単位)。
transferException false 有効にすると、リクエスト 応答メッセージング(InOut)を使用し、エクスチェンジ がコンシューマー側で失敗した場合、原因となった 例外 は応答として javax.jms.ObjectMessage として送り返されます。クライアントが Camel の場合、返される 例外が再出力 されます。これにより、Camel JMS をルーティングのブリッジとして使用できます。たとえば、永続キューを使用して堅牢なルーティングを有効にすることができます。transferExchange も有効にされている場合、このオプションは優先されることに注意してください。キャッチされた例外はシリアライズ可能である必要があります。コンシューマー側の元の例外は、プロデューサーに返されるときに org.apache.camel.RuntimeCamel Exception などの外部例外でラップできます。
transferFault false Camel 2.17: が有効で、リクエスト応答メッセージング(InOut)を使用し、エクスチェンジがコンシューマー側で SOAP 障害(例外ではない)で失敗した場合、org.apache.camel.Message.isFault() の fault フラグは、キー JmsConstants.JMS_TRANSFER_FAULT を持つ JMS ヘッダーとして応答として送り返されます。クライアントが Camel の場合、返される fault フラグが org.apache.camel.Message.setFault(boolean) に設定されます。CXF や Spring-WS などの SOAP ベースをサポートする Camel コンポーネントを使用する場合は、これを有効にできます。
transferExchange false ボディーとヘッダーだけでなく、ネットワーク上でエクスチェンジを転送することができます。以下のフィールドは転送されます:ボディー、Out body、Fault ボディー、In headers、Out ヘッダー、Fault ヘッダー、エクスチェンジプロパティー、エクスチェンジ例外。これには、オブジェクトがシリアライズ可能である必要があります。Camel はシリアライズできないオブジェクトを除外し、WARN レベルでログに記録します。このオプションはプロデューサーとコンシューマーの両方で有効に する必要があり ます。したがって、Camel はペイロードが通常のペイロードではなく Exchange であることを認識します。
username null コネクターファクトリーのユーザー名。
useMessageIDAsCorrelationID false JMSMessageID を常に InOut メッセージの JMSCorrelationID として使用するかどうかを指定します。
useVersion102 false @廃止予定(Camel 2.5 以降から削除): 古い JMS API を使用するかどうかを指定します。

サンプル

JMS は、他のコンポーネントにも多くの例で使用されます。ただし、開始するためのいくつかのサンプルを以下に示します。

JMS からの受信

以下の例では、JMS メッセージを受信し、そのメッセージを POJO にルーティングするルートを設定します。
from("jms:queue:foo").
   to("bean:myBusinessLogic");
Copy to Clipboard Toggle word wrap
ルートがコンテキストベースになるように、任意の EIP パターンを使用することができます。たとえば、大きな費ナーに対して注文トピックをフィルターリングする方法を以下に示します。
from("jms:topic:OrdersTopic").
  filter().method("myBean", "isGoldCustomer").
    to("jms:queue:BigSpendersQueue");
Copy to Clipboard Toggle word wrap

JMS に送信する

以下の例では、ファイルフォルダーをポーリングし、ファイルの内容を JMS トピックに送信します。BytesMessage ではなく TextMessage としてファイルの内容が必要な場合は、ボディーを String に変換する必要があります。
from("file://orders").
  convertBodyTo(String.class).
  to("jms:topic:OrdersTopic");
Copy to Clipboard Toggle word wrap

アノテーションの使用

Camel にはアノテーションも含まれるため、POJO Consuming および POJO Producing を使用できます。

Spring DSL の例

上記の例では Java DSL を使用しています。Camel は Spring XML DSL もサポートします。以下は、Spring DSL を使用した高額支出者のサンプルです。
<route>
  <from uri="jms:topic:OrdersTopic"/>
  <filter>
    <method bean="myBean" method="isGoldCustomer"/>
    <to uri="jms:queue:BigSpendersQueue"/>
  </filter>
</route>
Copy to Clipboard Toggle word wrap

その他のサンプル

JMS は、他のコンポーネントおよび EIP パターンの例の多くに表示され、この Camel ドキュメント にも記載されています。したがって、ドキュメントを自由に参照してください。

JMS と Camel 間のメッセージマッピング

Camel は javax.jms.Messageorg.apache.camel.Message の間でメッセージを自動的にマッピングします。
JMS メッセージを送信する場合、Camel はメッセージボディーを以下の JMS メッセージボディーに変換します。
Expand
ボディタイプ JMS Message Comment
文字列 javax.jms.TextMessage
org.w3c.dom.Node javax.jms.TextMessage DOM は String に変換されます。
マップ javax.jms.MapMessage
java.io.Serializable javax.jms.ObjectMessage
byte[] javax.jms.BytesMessage
java.io.File javax.jms.BytesMessage
java.io.Reader javax.jms.BytesMessage
java.io.InputStream javax.jms.BytesMessage
java.nio.ByteBuffer javax.jms.BytesMessage
JMS メッセージを受信すると、Camel は JMS メッセージを以下のボディー型に変換します。
Expand
JMS Message ボディタイプ
javax.jms.TextMessage 文字列
javax.jms.BytesMessage byte[]
javax.jms.MapMessage Map<String, Object>
javax.jms.ObjectMessage オブジェクト

JMS メッセージの自動マッピングの無効化

mapJmsMessage オプションを使用して、上記の自動マッピングを無効にすることができます。無効にすると、Camel は受信した JMS メッセージをマップせず、ペイロードとして直接使用します。これにより、マッピングのオーバーヘッドを回避し、Camel が JMS メッセージを通過させることができます。たとえば、クラスパス上に ない クラスで javax.jms.ObjectMessage JMS メッセージをルーティングすることもできます。

カスタム MessageConverter の使用

messageConverter オプションを使用して、Spring org.springframework.jms.support.converter.MessageConverter クラスでマッピングを実行できます。
たとえば、以下のルートでは、JMS 注文キューにメッセージを送信するときにカスタムメッセージコンバーターを使用します。
  from("file://inbox/order").to("jms:queue:order?messageConverter=#myMessageConverter");
Copy to Clipboard Toggle word wrap
JMS 宛先から消費するときに、カスタムメッセージコンバーターを使用することもできます。

選択したマッピングストラテジーの制御

エンドポイント URL で jmsMessageType オプションを使用して、すべてのメッセージに対して特定のメッセージタイプを強制的に実行できます。以下のルートでは、ファイルをフォルダーからポーリングし、javax.jms.TextMessage として送信します。これは、JMS プロデューサーエンドポイントがテキストメッセージを使用するように強制したためです。
from("file://inbox/order").to("jms:queue:order?jmsMessageType=Text");
Copy to Clipboard Toggle word wrap
ヘッダーに CamelJmsMessageType キーを設定して、各メッシングに使用するメッセージタイプを指定することもできます。以下に例を示します。
from("file://inbox/order").setHeader("CamelJmsMessageType", JmsMessageType.Text).to("jms:queue:order");
Copy to Clipboard Toggle word wrap
使用できる値は enum クラス org.apache.camel.jms.JmsMessageType で定義されます。

送信時のメッセージ形式

JMS ネットワーク上で送信されるエクスチェンジは、JMS Message 仕様 に準拠する必要があります。
exchange.in.header の場合、ヘッダー キー に以下のルールが適用されます。
  • JMS または JMSX で始まるキーは予約されています。
  • exchange.in.headers キーはリテラルで、すべて有効な Java 識別子である必要があります(キー名にドットを使用しないでください)。
  • Camel は、JMS メッセージを消費するときにドットとハイフンと逆順を置き換えます。.\_DOT\_ に置き換え、Camel がメッセージを消費するときに逆の置換を行います。\-\_HYPHEN\_ に置き換え、Camel がメッセージを消費するときに逆の置換を行います。
  • 鍵のフォーマットに独自のカスタムストラテジーを使用できるオプション jmsKeyFormatStrategy も併せて参照してください。
exchange.in.header の場合、以下のルールがヘッダー に適用されます。
  • 値はプリミティブまたはカウンターオブジェクト( IntegerLongCharacterなど)である必要があります。型、StringCharSequenceDateBigDecimal、および BigInteger はすべて、その toString () 表現に変換されます。その他のタイプはすべて破棄されます。
Camel は、特定のヘッダー値をドロップすると、DEBUG レベルでカテゴリー org.apache.camel.component.jms.JmsBinding でログに記録されます。以下に例を示します。
2008-07-09 06:43:04,046 [main           ] DEBUG JmsBinding
  - Ignoring non primitive header: order of class: org.apache.camel.component.jms.issues.DummyOrder with value: DummyOrder{orderId=333, itemId=4444, quantity=2}
Copy to Clipboard Toggle word wrap

受信時のメッセージ形式

Camel は、メッセージを受信すると、以下のプロパティーを エクスチェンジ に追加します。
Expand
プロパティー タイプ 説明
org.apache.camel.jms.replyDestination javax.jms.Destination 応答先。
Camel は、JMS メッセージを受信すると、以下の JMS プロパティーを In メッセージヘッダーに追加します。
Expand
ヘッダー タイプ 説明
JMSCorrelationID 文字列 JMS 相関 ID。
JMSDeliveryMode int JMS 配信モード。
JMSDestination javax.jms.Destination JMS 宛先。
JMSExpiration long JMS の有効期限。
JMSMessageID 文字列 JMS 一意のメッセージ ID。
JMSPriority int JMS の優先度(最も低い優先度は 0、最も高い優先順位が 9)
JMSRedelivered boolean は、JMS メッセージ再配信です。
JMSReplyTo javax.jms.Destination JMS 応答から宛先。
JMSTimestamp long JMS タイムスタンプ。
JMSType 文字列 JMS タイプ。
JMSXGroupID 文字列 JMS グループ ID。

Camel を使用したメッセージおよび JMSReplyTo の送受信

JMS コンポーネントは複雑で、場合によってはその動作に細心の注意を払う必要があります。そのため、これは検索する一部のエリア/動作の簡単な概要です。
Camel が JMSProducer を使用してメッセージを送信する場合、以下の条件をチェックします。
  • メッセージ交換パターン
  • JMSReplyTo がエンドポイントまたはメッセージヘッダーに設定されているかどうか。
  • 次のオプションが JMS エンドポイントに設定されているかどうか: disableReplyToprocaitMessageQosexplicitQos
これらはすべて複雑で、ユースケースをサポートするように理解し、設定できます。

JmsProducer

JmsProducer は設定に応じて以下のように動作します。
Expand
交換パターン その他のオプション 説明
InOut \- Camel は応答を想定し、一時的な JMSReplyTo を設定し、メッセージの送信後に一時キューでリプライメッセージをリッスンするようになります。
InOut JMSReplyTo が設定されている Camel は応答を想定し、メッセージの送信後に、指定された JMSReplyTo キューでリプライメッセージをリッスンし始めます。
InOnly \- Camel はメッセージを送信し、応答を想定し ません
InOnly JMSReplyTo が設定されている デフォルトでは、Camel は JMSReplyTo 宛先を破棄し、メッセージを送信する前に JMSReplyTo ヘッダーをクリアします。Camel はメッセージを送信し、応答を想定し ません。Camel はこれを WARN レベルでログに記録します( Camel 2.6 以降から DEBUG レベルに変更します)。preserveMessageQuo=true を使用して、JMSReplyTo を保持するよう Camel に指示することができます。すべての状況では、JmsProducer は応答を期待し ない ため、メッセージの送信後に続行します。

JmsConsumer

JmsConsumer は設定に応じて以下のように動作します。
Expand
交換パターン その他のオプション 説明
InOut \- Camel は応答を JMSReplyTo キューに送信します。
InOnly \- パターンが InOnly であるため、Camel は応答を返しません。
\- disableReplyTo=true このオプションは応答を抑制します。
そのため、エクスチェンジに設定されたメッセージ交換パターンに注意してください。
ルートの途中で JMS 宛先にメッセージを送信する場合は、使用する交換パターンを指定できます。詳細は、Request Reply を参照してください。これは、InOnly メッセージを JMS トピックに送信する場合に便利です。
from("activemq:queue:in")
   .to("bean:validateOrder")
   .to(ExchangePattern.InOnly, "activemq:topic:order")
   .to("bean:handleOrder");
Copy to Clipboard Toggle word wrap

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

多くの異なる JMS 宛先にメッセージを送信する必要がある場合は、JMS エンドポイントを再利用し、メッセージヘッダーで実際の宛先を指定することが理にかなっています。これにより、Camel は同じエンドポイントを再利用できますが、異なる宛先に送信することができます。これにより、メモリーおよびスレッドリソースで作成されたエンドポイント数が大幅に削減されます。
以下のヘッダーで宛先を指定できます。
Expand
ヘッダー タイプ 説明
CamelJmsDestination javax.jms.Destination 宛先オブジェクト。
CamelJmsDestinationName 文字列 宛先名。
たとえば、以下のルートは、実行時に宛先を計算し、それを使用して JMS URL に表示される宛先を上書きする方法を示しています。
from("file://inbox")
  .to("bean:computeDestination")
  .to("activemq:queue:dummy");
Copy to Clipboard Toggle word wrap
キュー名 dummy はプレースホルダーです。JMS エンドポイント URL の一部として提供される必要がありますが、この例では無視されます。
computeDestination Bean で、以下のように CamelJmsDestinationName ヘッダーを設定して実際の宛先を指定します。
public void setJmsHeader(Exchange exchange) {
   String id = ....
   exchange.getIn().setHeader("CamelJmsDestinationName", "order:" + id");
}
Copy to Clipboard Toggle word wrap
その後、Camel はこのヘッダーを読み取り、エンドポイントに設定されたヘッダーではなく宛先として使用します。そのため、この例では、Camel は id の値が 2 であると仮定して、activemq:queue:order:2 にメッセージを送信します。
CamelJmsDestination と CamelJmsDestination Name ヘッダーの両方が設定されている場合、CamelJmsDestination が優先されます。JMS プロデューサーは、エクスチェンジから CamelJmsDestination ヘッダーと CamelJmsDestinationName ヘッダーの両方を削除し、ルート内の誤ってループを回避するために作成された JMS メッセージに伝播しないことに注意してください(メッセージが別の JMS エンドポイントに転送されるシナリオ)。

異なる JMS プロバイダーの設定

以下のように、Spring XML で JMS プロバイダーを設定できます。
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
    <jmxAgent id="agent" disabled="true"/>
</camelContext>

<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
  <property name="connectionFactory">
    <bean class="org.apache.activemq.ActiveMQConnectionFactory">
      <property name="brokerURL" value="vm://localhost?broker.persistent=false&roker.useJmx=false"/>
    </bean>
  </property>
</bean>
Copy to Clipboard Toggle word wrap
基本的には、JMS コンポーネントインスタンスをいくつでも設定し、id 属性を 使用して一意の名前を指定できます。上記の例では、activemq コンポーネントを設定します。MQSeries、TibCo、BEA、Sonic などを設定するのも同様です。
名前付きの JMS コンポーネントを取得したら、URI を使用してそのコンポーネント内のエンドポイントを参照できます。たとえば、コンポーネント名 activemq の場合は、URI 形式 activemq:[queue:|topic:]destinationName を使用して宛先を参照できます。他のすべての JMS プロバイダーに同じ方法を使用できます。
これは、エンドポイント URI に使用するスキーム名の SpringContext からコンポーネントを遅延的にフェッチし、Component エンドポイント URI を解決することで機能します。

JNDI を使用した ConnectionFactory の検索

J2EE コンテナーを使用している場合は、Spring で通常の < bean > メカニズムを使用するのではなく、JNDI を検索して JMS ConnectionFactory を見つける必要がある場合があります。これは、Spring のファクトリー Bean または新しい Spring XML namespace を使用して実行できます。以下に例を示します。
<bean id="weblogic" class="org.apache.camel.component.jms.JmsComponent">
  <property name="connectionFactory" ref="myConnectionFactory"/>
</bean>

<jee:jndi-lookup id="myConnectionFactory" jndi-name="jms/connectionFactory"/>
Copy to Clipboard Toggle word wrap
JNDI ルックアップの詳細 は、Spring リファレンスドキュメントの jee スキーマ を参照してください。

同時消費

JMS の一般的な要件は、アプリケーションの応答性を高めるために、複数のスレッドでメッセージを同時に消費することです。以下のように、concurrentConsumers オプションを設定して、JMS エンドポイントを提供するスレッドの数を指定できます。
from("jms:SomeQueue?concurrentConsumers=20").
  bean(MyClass.class);
Copy to Clipboard Toggle word wrap
このオプションは、以下のいずれかの方法で設定できます。
  • JmsComponent で以下を行います。
  • エンドポイント URI または
  • JmsEndpointsetConcurrentConsumers () を直接呼び出す。

非同期コンシューマーを使用した同時消費

各同時コンシューマーは、現在のメッセージが完全に処理されたときに、JMS ブローカーから次に利用可能なメッセージのみを選択することに注意してください。オプション asyncConsumer=true を設定すると、コンシューマーが JMS キューから次のメッセージをピックアップし、以前のメッセージが非同期的に処理されます( Asynchronous Routing Engine)。詳細は、asyncConsumer のページ上部にある表を参照してください。
from("jms:SomeQueue?concurrentConsumers=20&asyncConsumer=true").
  bean(MyClass.class);
Copy to Clipboard Toggle word wrap

JMS でのリクエスト応答

Camel は JMS で のリクエスト応答 をサポートします。JMS キューにメッセージを送信する場合、エクスチェンジの MEP は InOut である必要があります。
Camel には、パフォーマンスとクラスター環境に影響を与える JMS 上でリクエスト/応答を設定するオプションが複数あります。以下の表は、オプションの概要を示しています。
Expand
オプション パフォーマンス Cluster 説明
Temporary 高速 はい 一時キューは応答キューとして使用され、Camel によって自動作成されます。これを使用するには、replyTo キュー名を指定し ません。また、任意で replyToType=Temporary を設定して、一時キューが使用されていることを示すことができます。
共有 Slow はい 共有永続キューが応答キューとして使用されます。キューは事前に作成する必要がありますが、一部のブローカーは Apache ActiveMQ などのオンザフライで作成できます。これを使用するには、replyTo キュー名を指定する必要があります。また、オプションで replyToType=Shared を設定して、共有キューが使用されていることを示すことができます。共有キューは、この Camel アプリケーションを同時に実行する複数のノードを持つクラスター環境で使用できます。すべては同じ共有応答キューを使用します。これは、JMS メッセージセレクターが想定されるリプライメッセージの関連付けに使用されるため可能です。ただし、これはパフォーマンスに影響します。JMS メッセージセレクターは遅くなるため、Temporary または Exclusive キューほど高速ではありません。パフォーマンスを向上させるために、これを微調整する方法は、以下を参照してください。
排他的 高速 いいえ 排他的な永続キューは応答キューとして使用されます。キューは事前に作成する必要がありますが、一部のブローカーは Apache ActiveMQ などのオンザフライで作成できます。これを使用するには、replyTo キュー名を指定する必要があります。また、replyTo キュー名 設定されている場合は、Shared がデフォルトで使用されるため、Camel に対して排他的キューを使用するように replyToType=Exclusive を設定する必要があります。排他的な応答キューを使用する場合、JMS メッセージセレクターは使用され ない ため、他のアプリケーションはこのキューを使用しないでください。排他的キューは、この Camel アプリケーションが同時に実行しているクラスター環境で使用することは できません。応答キューが要求メッセージを送信したのと同じノードに戻るかどうかを制御することができないため、共有キューが JMS メッセージセレクターを使用してこれを確実に行うためです。各排他的応答キューをノードごとに一意の名前で設定している場合 、クラスター環境でこれを実行できます。そのため、リプライメッセージは指定されたノードのそのキューに戻り、リプライメッセージを待機します。
concurrentConsumers 高速 はい Camel 2.10.3: 使用中の同時メッセージリスナーを使用してメッセージを同時に処理できるようにします。concurrentConsumers および maxConcurrentConsumers オプションを使用して範囲を指定できます。注記: Shared 応答キューを使用すると、同時リスナーでは適切に機能しない可能性があるため、このオプションを注意して使用してください。
maxConcurrentConsumers 高速 はい Camel 2.10.3: 使用中の同時メッセージリスナーを使用してメッセージを同時に処理できるようにします。concurrentConsumers および maxConcurrentConsumers オプションを使用して範囲を指定できます。注記: Shared 応答キューを使用すると、同時リスナーでは適切に機能しない可能性があるため、このオプションを注意して使用してください。
JmsProducerInOut を検出し、使用される応答宛先を持つ JMSReplyTo ヘッダーを提供します。デフォルトでは、Camel は一時キューを使用しますが、エンドポイントで replyTo オプションを使用して、固定された応答キューを指定できます(以下の未指定の応答キューについて参照)。
Camel は応答キューをリッスンするコンシューマーを自動的に設定するため、何もし ない でください。このコンシューマーは、応答をリッスンする Spring DefaultMessageListenerContainer です。ただし、同時コンシューマー 1 つに固定されています。つまり、返信を処理するスレッドが 1 つしかないため、応答が順番に処理されます。応答をより迅速に処理する場合は、同時実行を使用する必要があります。ただし、concurrentConsumer オプション は使用しません。以下のルートに示されるように、代わりに Camel DSL からの スレッド を使用する必要があります。
from(xxx)
.inOut().to("activemq:queue:foo")
.threads(5)
.to(yyy)
.to(zzz);
Copy to Clipboard Toggle word wrap
このルートでは、5 つのスレッドを持つスレッドプールを使用してリプライを 非同期 にルーティングするように Camel に指示します。
ヒント
スレッドを使用する代わりに、Camel 2.10.3 以上を使用する場合は concurrentConsumers オプションを使用します。詳細は以下を参照してください。
Camel 2.10.3 以降では、concurrentConsumers および maxConcurrentConsumers オプションを使用して、リスナーが同時スレッドを使用するように設定できます。これにより、以下のように Camel でこの設定を簡単に設定できます。
from(xxx)
.inOut().to("activemq:queue:foo?concurrentConsumers=5")
.to(yyy)
.to(zzz);
Copy to Clipboard Toggle word wrap

JMS 上でリクエスト応答し、共有固定応答キューを使用する

以下の例のように Request Reply over JMS を実行する際に、固定応答キューを使用する場合は注意してください。
from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar")
.to(yyy)
Copy to Clipboard Toggle word wrap
この例では、bar という名前の固定応答キューが使用されます。デフォルトでは、Camel は固定応答キューの使用時にキューが共有されていると仮定するため、JMSSelector を使用して想定されるリプライメッセージのみを選択します(例: JMSCorrelationID)。排他的な固定応答キューについては、次のセクションを参照してください。つまり、一時キューほど高速ではありません。receiveTimeout オプションを使用して、Camel が応答メッセージに対してプルする頻度をスピードアップできます。デフォルトでは 1000 ミリ秒です。そのため、これをより迅速に設定するには、以下のように 250 ミリ秒に設定して、1 秒あたり 4 回プルできます。
from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar&receiveTimeout=250")
.to(yyy)
Copy to Clipboard Toggle word wrap
これにより、Camel がメッセージブローカーにプル要求を送信するため、より多くのネットワークトラフィックが必要になることに注意してください。通常、可能な場合は一時キューを使用することが推奨されます。

JMS のリクエスト応答と排他的な固定応答キューの使用

Camel 2.9 以降で利用可能
上記の例では、Camel は bar という名前の固定応答キューが共有されていることを想定するため、JMSSelector を使用して想定するリプライメッセージのみを消費します。ただし、JMS selectos が遅くなるため、これを行う欠点があります。また、応答キューのコンシューマーは、新しい JMS セレクター ID での更新に時間がかかります。実際、receiveTimeout オプションがタイムアウトした場合にのみ更新されます。デフォルトは 1 秒です。そのため、理論的にはリプライメッセージの検出に約 1 秒かかる可能性があります。一方、固定応答キューが Camel 応答コンシューマーに排他的である場合は、JMS セレクターを使用しないようにすることができます。実際、一時キューを使用するほど高速です。そのため、Camel 2.9 以降では、以下の例のように応答キューが排他的であることを Camel に指示するために設定できる ReplyToType オプションが導入されました。
from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar&replyToType=Exclusive")
.to(yyy)
Copy to Clipboard Toggle word wrap
キューは、各エンドポイントおよびすべてのエンドポイント専用である必要があることに注意してください。そのため、2 つのルートがある場合は、以下の例のようにそれぞれ固有の応答キューが必要になります。
from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar&replyToType=Exclusive")
.to(yyy)

from(aaa)
.inOut().to("activemq:queue:order?replyTo=order.reply&replyToType=Exclusive")
.to(bbb)
Copy to Clipboard Toggle word wrap
クラスター環境で実行する場合は、同じことが当てはまります。次に、クラスターの各ノードは一意の応答キュー名を使用する必要があります。そうしないと、クラスター内の各ノードは、別のノードへの応答として意図されたメッセージが選択される可能性があります。クラスター環境では、代わりに共有応答キューを使用することが推奨されます。

送信側と受信側のクロックの同期

システム間でメッセージングを実行する場合は、システムがクロックを同期していることが望ましいです。たとえば、JMS メッセージを送信する場合、メッセージに時間(time to live)を設定できます。次に、受信側はこの値を検査し、メッセージがすでに期限切れであるかどうかを判断できるため、メッセージを消費して処理するのではなくドロップできます。ただし、これには、送信者と受信側の両方がクロックを同期している必要があります。ActiveMQ を使用している場合は、タイムスタンププラグイン を使用してクロックを同期できます。

存続期間

同期されたクロックについては、上記の最初の読み取り。
Camel で JMS でリクエスト/リプライ(InOut)を実行すると、Camel は送信者側でタイムアウトを使用します。これは、requestTimeout オプションのデフォルト 20 秒です。より高い/小さい値を設定することで、これを制御できます。ただし、ライブタイムは、送信する JMS メッセージに引き続き設定されます。では、がシステム間でクロックを同期する必要があります。設定されていない場合、ライブ値を設定する時間を無効にすることができます。これは、Camel 2.8 以降から disableTimeToLive オプションを使用して実行できるようになりました。そのため、このオプションを disableTimeToLive=true に設定すると、Camel は JMS メッセージの送信時に存続時間を設定し ませんただし、 リクエストのタイムアウトはアクティブな状態です。たとえば、JMS でリクエスト/リプライをライブで行なっても、Camel は引き続きタイムアウトを 20 秒( requestTimeout オプション)使用します。当然ながら、このオプションを設定することもできます。そのため、requestTimeoutdisableTimeToLive の 2 つのオプションにより、リクエスト/リプライを行うときに詳細な制御が可能になります。
Camel 2.13/2.12.3 以降では、メッセージに ヘッダーを指定して、エンドポイントで設定された値の代わりに、リクエストタイムアウト値として上書きおよび使用できます。以下に例を示します。
from("direct:someWhere")
  .to("jms:queue:foo?replyTo=bar&requestTimeout=30s")
  .to("bean:processReply");
Copy to Clipboard Toggle word wrap
上記のルートでは、requestTimeout を 30 秒に設定したエンドポイントがあります。そのため、Camel は、その応答メッセージがバーキューに戻るまで 30 秒待機します。リプライメッセージが受信されない場合、エクスチェンジorg.apache.camel.ExchangeTimedOutException が設定され、Camel はメッセージのルーティングを続行します。これは例外によって失敗し、Camel のエラーハンドラーが反応します。
メッセージのタイムアウト値ごとに使用する場合は、定数値 "CamelJmsRequestTimeout" のキー org.apache.camel.component.jms.JmsConstants#JMS_REQUEST_TIMEOUT でヘッダーを設定し、タイムアウト値を long 型に設定します。
たとえば、以下のように Bean を使用して、サービス Bean で whatIsTheTimeout メソッドを呼び出すなど、個別のメッセージごとにタイムアウト値を計算することができます。
from("direct:someWhere")
  .setHeader("CamelJmsRequestTimeout", method(ServiceBean.class, "whatIsTheTimeout"))
  .to("jms:queue:foo?replyTo=bar&requestTimeout=30s")
  .to("bean:processReply");
Copy to Clipboard Toggle word wrap
Camel を使用して JMS 経由で forget (InOut)を実行し、取得(InOut)を実行する場合、デフォルトで Camel はメッセージのライブ値を設定し ませんtimeToLive オプションを使用して値を設定できます。たとえば、5 秒を指定するには、timeToLive=5000 を設定しますdisableTimeToLive オプションを使用して、InOnly メッセージングでも存続時間を強制的に無効にすることができます。requestTimeout オプションは、InOnly メッセージングには使用されません。

Transacted Consumption の有効化

一般的な要件は、トランザクションのキューから消費してから、Camel ルートを使用してメッセージを処理することです。これを実行するには、コンポーネント/エンドポイントに以下のプロパティーを設定するようにしてください。
  • transacted = true
  • TransactionManager = Transsaction Manager \- 通常は JmsTransactionManager
詳細は、Transactional Client EIP パターンを参照してください。
JMS 上のトランザクションおよびリクエスト応答
JMS で Request Reply を使用すると、1 つのトランザクションは使用できません。JMS はコミットが実行されるまでメッセージを送信しないため、サーバー側はトランザクションのコミットまで何も受信しません。そのため、Request Reply を使用するには、リクエストの送信後にトランザクションをコミットし、応答を受信するために別のトランザクションを使用する必要があります。
この問題に対処するために、JMS コンポーネントは異なるプロパティーを使用して一方向メッセージングおよび要求応答メッセージングに使用するトランザクションを指定します。
transacted プロパティーは、InOnly メッセージ交換 パターン (MEP)に のみ 適用されます。
transactedInOut プロパティーは、InOut (Request Reply)メッセージ交換 パターン (MEP)に適用されます。
Camel 2.10 以降で利用可能
コンポーネント/エンドポイントで以下のプロパティーを使用して、DMLC トランザクションセッション API を利用できます。
  • transacted = true
  • lazyCreateTransactionManager = false
これを実行する利点は、TransactionManager を設定せずにローカルトランザクションを使用する場合に cacheLevel 設定を有効にすることです。TransactionManager が設定されている場合、DMLC レベルでキャッシングは発生せず、プールされた接続ファクトリーに依存する必要があります。このような設定の詳細は、こちらおよび こちら を参照してください。

応答の遅れに JMSReplyTo を使用する

Camel を JMS リスナーとして使用する場合、キー ReplyTo を持つ ReplyTo javax.jms.Destination オブジェクトの値で Exchange プロパティーを設定します。この 宛先 は、以下のように取得できます。
Destination replyDestination = exchange.getIn().getHeader(JmsConstants.JMS_REPLY_DESTINATION, Destination.class);
Copy to Clipboard Toggle word wrap
その後、それを使用して通常の JMS または Camel を使用して応答を送信します。
// we need to pass in the JMS component, and in this sample we use ActiveMQ
JmsEndpoint endpoint = JmsEndpoint.newInstance(replyDestination, activeMQComponent);
// now we have the endpoint we can use regular Camel API to send a message to it
template.sendBody(endpoint, "Here is the late reply.");
Copy to Clipboard Toggle word wrap
応答を送信する別のソリューションは、送信時に同じエクスチェンジプロパティーに replyDestination オブジェクトを提供することです。その後、Camel はこのプロパティーを取得し、実際の宛先に使用します。ただし、エンドポイント URI にはダミーの宛先が含まれている必要があります。以下に例を示します。
// we pretend to send it to some non existing dummy queue
template.send("activemq:queue:dummy, new Processor() {
    public void process(Exchange exchange) throws Exception {
        // and here we override the destination with the ReplyTo destination object so the message is sent to there instead of dummy
        exchange.getIn().setHeader(JmsConstants.JMS_DESTINATION, replyDestination);
        exchange.getIn().setBody("Here is the late reply.");
    }
}
Copy to Clipboard Toggle word wrap

リクエストタイムアウトの使用

以下の例では、リクエスト応答スタイルのメッセージ Exchange ( requestBody method = InOutを使用)を Camel でさらに処理するために低速なキューに送り、返信応答を待ちます。http://camel.apache.org/request-reply.html
// send a in-out with a timeout for 5 sec
Object out = template.requestBody("activemq:queue:slow?requestTimeout=5000", "Hello World");
Copy to Clipboard Toggle word wrap

JMS をエクスチェンジを保存する Dead Letter Queue として使用

通常、JMS をトランスポートとして使用する場合、ボディーとヘッダーのみをペイロードとして転送します。Dead Letter Channel で JMS を使用する場合は、JMS キューを Dead Letter Queue として使用する場合、通常は原因となる例外が JMS メッセージに保存されません。ただし、JMS デッドレターキューで transferExchange オプションを使用して、org.apache.camel.impl.DefaultExchangeHolder を保持する javax.jms.ObjectMessage として エクスチェンジ 全体をキューに保存するよう Camel に指示することができます。これにより、Dead Letter Queue から消費でき、キー Exchange.EXCEPTION_CAUGHT を使用してエクスチェンジプロパティーから例外を取得できます。以下のデモでは、以下のようになります。
// setup error handler to use JMS as queue and store the entire Exchange
errorHandler(deadLetterChannel("jms:queue:dead?transferExchange=true"));
Copy to Clipboard Toggle word wrap
その後、JMS キューから消費し、問題を分析できます。
from("jms:queue:dead").to("bean:myErrorAnalyzer");

// and in our bean
String body = exchange.getIn().getBody();
Exception cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);
// the cause message is
String problem = cause.getMessage();
Copy to Clipboard Toggle word wrap

JMS を Dead Letter Channel 保存エラーとしてのみ使用

JMS を使用して原因のエラーメッセージを保存したり、初期化できるカスタムボディーを保存したりできます。以下の例では、Message Translator EIP を使用して、JMS デッドレターキューに移動する前に、失敗したエクスチェンジの変換を行います。
// we sent it to a seda dead queue first
errorHandler(deadLetterChannel("seda:dead"));

// and on the seda dead queue we can do the custom transformation before its sent to the JMS queue
from("seda:dead").transform(exceptionMessage()).to("jms:queue:dead");
Copy to Clipboard Toggle word wrap
ここでは、元の原因エラーメッセージのみを変換に保存します。ただし、任意の式を使用して 任意 のものを送信できます。たとえば、Bean でメソッドを呼び出すか、カスタムプロセッサーを使用することができます。

InOnly メッセージの送信および JMSReplyTo ヘッダーの維持

camel-jms を使用して JMS 宛先に送信する場合、プロデューサーは MEP を使用して InOnly または InOut メッセージングを検出します。ただし、InOnly メッセージを送信し、JMSReplyTo ヘッダーを保持する場合があります。これを実行するには、Camel に対してこれを保持するよう指示する必要があります。そうでないと、JMSReplyTo ヘッダーがドロップされます。
たとえば、InOnly メッセージを foo キューに送信し、bar キューを持つ JMSReplyTo を使用するには、以下を実行します。
template.send("activemq:queue:foo?preserveMessageQos=true", new Processor() {
   public void process(Exchange exchange) throws Exception {
      exchange.getIn().setBody("World");
      exchange.getIn().setHeader("JMSReplyTo", "bar");
   }
});
Copy to Clipboard Toggle word wrap
preserveMessageQos=true を使用して、JMSReplyTo ヘッダーを保持するよう Camel に指示することに注意してください。

宛先での JMS プロバイダーオプションの設定

IBM の WebSphere MQ などの一部の JMS プロバイダーには、JMS 宛先でオプションを設定する必要があります。たとえば、targetClient オプションを指定する必要がある場合があります。targetClient は Camel URI オプションではなく WebSphere MQ オプションであるため、以下のように JMS 宛先名で設定する必要があります。
...
.setHeader("CamelJmsDestinationName", constant("queue:///MY_QUEUE?targetClient=1"))
.to("wmq:queue:MY_QUEUE?useMessageIDAsCorrelationID=true");
Copy to Clipboard Toggle word wrap
一部のバージョンの WMQ は、宛先名でこのオプションを受け入れないため、以下のような例外が発生します。
com.ibm.msg.client.jms.DetailedJMSException: JMSCC0005: 指定された値 'MY_QUEUE?targetClient=1' is not allowed for 'XMSC_DESTINATION_NAME'
回避策として、カスタム DestinationResolver を使用します。
JmsComponent wmq = new JmsComponent(connectionFactory);

wmq.setDestinationResolver(new DestinationResolver(){
    public Destination resolveDestinationName(Session session, String destinationName, boolean pubSubDomain) throws JMSException {
        MQQueueSession wmqSession = (MQQueueSession) session;
        return wmqSession.createQueue("queue:///" + destinationName + "?targetClient=1");
    }
});
Copy to Clipboard Toggle word wrap

関連項目

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat