第37章 プロデューサーおよびコンシューマーテンプレート
概要
Apache Camel のプロデューサーテンプレートおよびコンシューマーテンプレートは、Spring コンテナー API の機能にちなんでモデル化されています。リソースへのアクセスは、テンプレート と呼ばれる単純で使いやすい API を使用して提供されます。Apache Camel の場合、プロデューサーテンプレートおよびコンシューマーテンプレートは、プロデューサーエンドポイントおよびコンシューマーエンドポイントとの間でメッセージを送受信するためのシンプルなインターフェイスを提供します。
37.1. プロデューサーテンプレートの使用 リンクのコピーリンクがクリップボードにコピーされました!
37.1.1. プロデューサーテンプレートの概要 リンクのコピーリンクがクリップボードにコピーされました!
概要 リンクのコピーリンクがクリップボードにコピーされました!
プロデューサーテンプレートは、プロデューサーエンドポイントを呼び出すさまざまな方法をサポートします。リクエストメッセージの異なる形式 (Exchange
オブジェクト、メッセージボディー、単一のヘッダー設定を持つメッセージボディーなど) をサポートするメソッドや、呼び出しの同期と非同期スタイルの両方をサポートするメソッドがあります。全体的なプロデューサーテンプレートメソッドは、以下のカテゴリーにグループ化できます。
または、「Fluent Producer テンプレートの使用」 を参照してください。
同期呼び出し リンクのコピーリンクがクリップボードにコピーされました!
エンドポイントを同期的に呼び出すメソッドには、sendSuffix()
および requestSuffix()
という形式の名前があります。たとえば、デフォルトのメッセージ交換パターン (MEP) または明示的に指定された MEP を使用してエンドポイントを呼び出すメソッドには、send()
、sendBody()
、および sendBodyAndHeader()
の名前が付けられます (これらのメソッドがそれぞれ Exchange
オブジェクト、メッセージボディー、またはメッセージボディーおよびヘッダー値を送信する場合)。MEP を InOut (リクエスト/リプライセマンティクス) に強制するには、代わりに request()
、requestBody()
、および requestBodyAndHeader()
メソッドを呼び出します。
以下の例は、ProducerTemplate
インスタンスを作成し、これを使用してメッセージボディーを activemq:MyQueue
エンドポイントに送信する方法を示しています。この例は、sendBodyAndHeader()
を使用してメッセージボディーとヘッダー値を送信する方法も示しています。
プロセッサーを使用した同期呼び出し リンクのコピーリンクがクリップボードにコピーされました!
同期呼び出しの特別なケースとして、send()
メソッドに引数 Exchange
ではなく引数 Processor
を指定することがあります。この場合、プロデューサーテンプレートは暗黙的に指定のエンドポイントに Exchange
インスタンスを作成するよう指示します (常にではありませんが、通常はデフォルトで InOnly MEP を持ちます)。このデフォルトのエクスチェンジはプロセッサーに渡され、エクスチェンジオブジェクトの内容を初期化します。
以下の例は、MyProcessor
プロセッサーによって初期化されたエクスチェンジを activemq:MyQueue
エンドポイントに送信する方法を示しています。
MyProcessor
クラスは以下の例のように実装されます。(ここで示したように) In メッセージボディーを設定する他に、メッセージヘッダーおよび交換プロパティーを初期化することもできます。
非同期呼び出し リンクのコピーリンクがクリップボードにコピーされました!
エンドポイントを 非同期的 に呼び出すメソッドの名前の形式は、asyncSendSuffix()
および asyncRequestSuffix()
です。たとえば、デフォルトのメッセージ交換パターン (MEP) または明示的に指定された MEP を使用してエンドポイントを呼び出すメソッドには、asyncSend()
および asyncSendBody()
の名前が付けられます (これらのメソッドはそれぞれ Exchange
オブジェクトまたはメッセージボディーを送信します)。MEP を InOut (リクエスト/リプライセマンティクス) に強制するには、代わりに asyncRequestBody()
、asyncRequestBodyAndHeader()
、および asyncRequestBodyAndHeaders()
メソッドを呼び出します。
以下の例は、direct:start
エンドポイントにエクスチェンジを非同期的に送信する方法を示しています。asyncSend()
メソッドは、後で呼び出しの結果を取得するために使用される java.util.concurrent.Future
オブジェクトを返します。
プロデューサーテンプレートは、メッセージのボディーを非同期的に送信するメソッドも提供します (例: asyncSendBody()
または asyncRequestBody()
を使用します)。この場合、以下のヘルパーメソッドのいずれかを使用して、Future
オブジェクトから返されたメッセージのボディーを抽出できます。
<T> T extractFutureBody(Future future, Class<T> type); <T> T extractFutureBody(Future future, long timeout, TimeUnit unit, Class<T> type) throws TimeoutException;
<T> T extractFutureBody(Future future, Class<T> type);
<T> T extractFutureBody(Future future, long timeout, TimeUnit unit, Class<T> type) throws TimeoutException;
呼び出しが完了し、リプライメッセージが表示されるまで extractFutureBody()
メソッドの最初のバージョンはブロックされます。extractFutureBody()
メソッドの 2 番目のバージョンでは、タイムアウトを指定できます。どちらのメソッドも type 引数 type
を持ち、組み込み型コンバーターを使用して、返されるメッセージのボディーを指定された型にキャストします。
以下の例は、asyncRequestBody()
メソッドを使用してメッセージボディーを direct:start
エンドポイントに送信する方法を示しています。次に、ブロッキングしている extractFutureBody()
メソッドを使用して Future
オブジェクトからリプライメッセージのボディーを取得します。
コールバックを使用した非同期呼び出し リンクのコピーリンクがクリップボードにコピーされました!
上記の非同期例では、リクエストメッセージはサブスレッドでディスパッチされ、応答はメインスレッドによって取得および処理されます。しかし、プロデューサーテンプレートでも、asyncCallback()
、asyncCallbackSendBody()
、または asyncCallbackRequestBody()
メソッドのいずれかを使用して、サブスレッドで返信を処理するオプションもあります。この場合、コールバックオブジェクト (org.apache.camel.impl.SynchronizationAdapter
タイプ) を指定します。このオブジェクトは、リプライメッセージが到達するとすぐに自動的にサブスレッドで呼び出されます。
Synchronization
コールバックインターフェイスは、以下のように定義されます。
ここで、通常の応答の受信時に onComplete()
メソッドが呼び出され、障害メッセージの応答を受け取る際に onFailure()
メソッドが呼び出されます。これらのメソッドの 1 つのみが呼び出されるため、両方のメソッドを上書きして、すべてのタイプの応答が処理されるようにする必要があります。
以下の例は、リプライメッセージが SynchronizationAdapter
コールバックオブジェクトによってサブスレッドで処理される、direct:start
エンドポイントにエクスチェンジを送信する方法を示しています。
SynchronizationAdapter
クラスは Synchronization
インターフェイスのデフォルト実装で、onComplete()
および onFailure()
コールバックメソッドの独自の定義を上書きできます。
asyncCallback()
メソッドによって Future
object vulkan-conditionals も返すため、メインスレッドから応答にアクセスするオプションは依然としてあります。
// Retrieve the reply from the main thread, specifying a timeout Exchange reply = future.get(10, TimeUnit.SECONDS);
// Retrieve the reply from the main thread, specifying a timeout
Exchange reply = future.get(10, TimeUnit.SECONDS);
37.1.2. 同期送信 リンクのコピーリンクがクリップボードにコピーされました!
概要 リンクのコピーリンクがクリップボードにコピーされました!
同期送信 メソッドは、プロデューサーエンドポイントの呼び出しに使用できるメソッドのコレクションです。メソッド呼び出しが完了し、応答 (ある場合) が受信されるまで現在のスレッドをブロックします。これらのメソッドは、あらゆる種類のメッセージ交換プロトコルと互換性があります。
エクスチェンジの送信 リンクのコピーリンクがクリップボードにコピーされました!
基本的な send()
メソッドは、エクスチェンジのメッセージ交換パターン (MEP) を使用して、Exchange
オブジェクトのコンテンツをエンドポイントに送信する汎用メソッドです。戻り値は、プロデューサーエンドポイントによって処理された後に取得するエクスチェンジです (MEP によっては Out メッセージが含まれる可能性があります)。
デフォルトのエンドポイント、エンドポイント URI、または send()
オブジェクトとしてターゲットエンドポイントを指定できるエクスチェンジの送信では、3 種類の Endpoint
メソッドががあります。
Exchange send(Exchange exchange); Exchange send(String endpointUri, Exchange exchange); Exchange send(Endpoint endpoint, Exchange exchange);
Exchange send(Exchange exchange);
Exchange send(String endpointUri, Exchange exchange);
Exchange send(Endpoint endpoint, Exchange exchange);
プロセッサーによって提供されたエクスチェンジの送信 リンクのコピーリンクがクリップボードにコピーされました!
一般的な send()
メソッドは、エクスチェンジオブジェクトを明示的に提供するのではなく、プロセッサーを使用してデフォルトのエクスチェンジを設定することです (詳細は 「プロセッサーを使用した同期呼び出し」 を参照してください)。
プロセッサーによって設定されるエクスチェンジを送信する send()
メソッドにより、デフォルトのエンドポイント、エンドポイント URI、または Endpoint
オブジェクトとしてターゲットエンドポイントを指定できます。さらに、オプションでエクスチェンジの MEP を指定するには、デフォルトを許可せずに、pattern
引数を指定します。
メッセージボディーの送信 リンクのコピーリンクがクリップボードにコピーされました!
送信するメッセージボディーの内容のみに関心がある場合は、sendBody()
メソッドを使用してメッセージボディーを引数として提供し、プロデューサーテンプレートにボディーをデフォルトのエクスチェンジオブジェクトに挿入させることができます。
sendBody()
メソッドにより、ターゲットエンドポイントをデフォルトのエンドポイント、エンドポイント URI、または Endpoint
オブジェクトとして指定できます。さらに、オプションでエクスチェンジの MEP を指定するには、デフォルトを許可せずに、pattern
引数を指定します。pattern
引数の ない メソッドは、void
を返します (呼び出しによって応答が発生する可能性もあります)。また、pattern
引数の ある メソッドは、Out メッセージのボディー (ある場合) または In メッセージのボディー (それ以外の場合) のいずれかを返します。
メッセージボディーとヘッダーの送信 リンクのコピーリンクがクリップボードにコピーされました!
テストの目的で、単一 のヘッダー設定の影響を試すことが望ましいことが多く、sendBodyAndHeader()
メソッドはこのようなヘッダーテストに役立ちます。メッセージボディーとヘッダー設定を引数として sendBodyAndHeader()
に提供し、プロデューサーテンプレートがボディーとヘッダー設定をデフォルトのエクスチェンジオブジェクトに挿入できるようにします。
sendBodyAndHeader()
メソッドにより、ターゲットエンドポイントをデフォルトのエンドポイント、エンドポイント URI、または Endpoint
オブジェクトとして指定できます。さらに、オプションでエクスチェンジの MEP を指定するには、デフォルトを許可せずに、pattern
引数を指定します。pattern
引数の ない メソッドは、void
を返します (呼び出しによって応答が発生する可能性もあります)。また、pattern
引数の ある メソッドは、Out メッセージのボディー (ある場合) または In メッセージのボディー (それ以外の場合) のいずれかを返します。
sendBodyAndHeaders()
メソッドは sendBodyAndHeader()
メソッドと似ていますが、単一のヘッダー設定を指定する代わりに、ヘッダー設定の完全なハッシュマップを指定することができます。
メッセージボディーおよびエクスチェンジプロパティーの送信 リンクのコピーリンクがクリップボードにコピーされました!
sendBodyAndProperty()
メソッドを使用して、単一のエクスチェンジプロパティーを設定する効果を試すことができます。sendBodyAndProperty()
にメッセージボディーとプロパティー設定を引数として提供し、プロデューサーテンプレートがボディーを挿入し、エクスチェンジプロパティーをデフォルトのエクスチェンジオブジェクトに挿入できるようにします。
sendBodyAndProperty()
メソッドにより、ターゲットエンドポイントをデフォルトのエンドポイント、エンドポイント URI、または Endpoint
オブジェクトとして指定できます。さらに、オプションでエクスチェンジの MEP を指定するには、デフォルトを許可せずに、pattern
引数を指定します。pattern
引数の ない メソッドは、void
を返します (呼び出しによって応答が発生する可能性もあります)。また、pattern
引数の ある メソッドは、Out メッセージのボディー (ある場合) または In メッセージのボディー (それ以外の場合) のいずれかを返します。
37.1.3. InOut パターンでの同期リクエスト リンクのコピーリンクがクリップボードにコピーされました!
概要 リンクのコピーリンクがクリップボードにコピーされました!
同期リクエスト メソッドは同期送信メソッドと似ていますが、リクエストメソッドはメッセージ交換パターンを強制的に InOut にします (リクエスト/リプライセマンティクスに準拠)。そのため、プロデューサーエンドポイントから応答を受信することが予想される場合は、一般的に同期リクエストメソッドを使用することが推奨されます。
プロセッサーによって設定されたエクスチェンジの要求 リンクのコピーリンクがクリップボードにコピーされました!
基本的な request()
メソッドは、プロセッサーを使用してデフォルトのエクスチェンジの設定を行い、メッセージ交換パターンを InOut に強制する (よって呼び出しがリクエスト/リプライセマンティクスに従う) 汎用メソッドです。戻り値は、プロデューサーエンドポイントによって処理された後に得られるエクスチェンジです。Out メッセージにはリプライメッセージが含まれます。
プロセッサーによって設定されるエクスチェンジを送信するために request()
メソッドを使用すると、エンドポイント URI または Endpoint
オブジェクトとしてターゲットエンドポイントを指定できます。
Exchange request(String endpointUri, Processor processor); Exchange request(Endpoint endpoint, Processor processor);
Exchange request(String endpointUri, Processor processor);
Exchange request(Endpoint endpoint, Processor processor);
メッセージボディーの要求 リンクのコピーリンクがクリップボードにコピーされました!
リクエストと応答のメッセージボディーの内容のみに関心がある場合は、requestBody()
メソッドを使用してリクエストメッセージのボディーを引数として提供し、プロデューサーテンプレートにボディーをデフォルトのエクスチェンジオブジェクトに挿入させることができます。
requestBody()
メソッドにより、ターゲットエンドポイントをデフォルトのエンドポイント、エンドポイント URI、または Endpoint
オブジェクトとして指定できます。戻り値は、リプライメッセージのボディー (Out メッセージボディー) で、プレーン Object
として返されるか、組み込み型コンバーター (「組み込み型コンバーター」 を参照) を使用して特定のタイプ T
に変換されます。
メッセージのボディーおよびヘッダーの要求 リンクのコピーリンクがクリップボードにコピーされました!
requestBodyAndHeader()
メソッドを使用して、単一のヘッダー値を設定する効果を試すことができます。メッセージボディーとヘッダー設定を引数として requestBodyAndHeader()
に提供し、プロデューサーテンプレートがボディーを挿入し、プロパティーをデフォルトのエクスチェンジオブジェクトに挿入できるようにします。
requestBodyAndHeader()
メソッドを使用すると、エンドポイント URI または Endpoint
オブジェクトとして、ターゲットエンドポイントを指定することができます。戻り値は、リプライメッセージのボディー (Out メッセージボディー) で、プレーン Object
として返されるか、組み込み型コンバーター (「組み込み型コンバーター」 を参照) を使用して特定のタイプ T
に変換されます。
requiestBodyAndHeaders()
メソッドは requestBodyAndHeader()
メソッドと似ていますが、単一のヘッダー設定を指定する代わりに、ヘッダー設定の完全なハッシュマップを指定することができます。
37.1.4. 非同期送信 リンクのコピーリンクがクリップボードにコピーされました!
概要 リンクのコピーリンクがクリップボードにコピーされました!
プロデューサーテンプレートは、プロデューサーエンドポイントを非同期的に呼び出すさまざまな方法を提供します。これにより、メインスレッドが呼び出しの完了を待機している間にブロックされず、リプライメッセージが後で取得できます。本項で説明されている非同期送信方法は、あらゆる種類のメッセージ交換プロトコルと互換性があります。
エクスチェンジの送信 リンクのコピーリンクがクリップボードにコピーされました!
基本的な asyncSend()
メソッドは Exchange
引数を取り、指定されたエクスチェンジのメッセージ交換パターン (MEP) を使用してエンドポイントを非同期的に呼び出します。戻り値は java.util.concurrent.Future
オブジェクトで、後でリプライメッセージを収集するために使用できるチケットです。Future
オブジェクトから戻り値を取得する方法の詳細は、「非同期呼び出し」 を参照してください。
以下の asyncSend()
メソッドを使用すると、エンドポイント URI または Endpoint
オブジェクトとして、ターゲットエンドポイントを指定することができます。
Future<Exchange> asyncSend(String endpointUri, Exchange exchange); Future<Exchange> asyncSend(Endpoint endpoint, Exchange exchange);
Future<Exchange> asyncSend(String endpointUri, Exchange exchange);
Future<Exchange> asyncSend(Endpoint endpoint, Exchange exchange);
プロセッサーによって提供されたエクスチェンジの送信 リンクのコピーリンクがクリップボードにコピーされました!
一般的な asyncSend()
メソッドは、エクスチェンジオブジェクトを明示的に提供するのではなく、プロセッサーを使用してデフォルトのエクスチェンジを設定することです。
以下の asyncSend()
メソッドを使用すると、エンドポイント URI または Endpoint
オブジェクトとして、ターゲットエンドポイントを指定することができます。
Future<Exchange> asyncSend(String endpointUri, Processor processor); Future<Exchange> asyncSend(Endpoint endpoint, Processor processor);
Future<Exchange> asyncSend(String endpointUri, Processor processor);
Future<Exchange> asyncSend(Endpoint endpoint, Processor processor);
メッセージボディーの送信 リンクのコピーリンクがクリップボードにコピーされました!
送信するメッセージボディーの内容のみに関心がある場合は、asyncSendBody()
メソッドを使用してメッセージボディーを非同期的に送信し、プロデューサーテンプレートにボディーをデフォルトのエクスチェンジオブジェクトに挿入させることができます。
asyncSendBody()
メソッドを使用すると、エンドポイント URI または Endpoint
オブジェクトとして、ターゲットエンドポイントを指定することができます。
Future<Object> asyncSendBody(String endpointUri, Object body); Future<Object> asyncSendBody(Endpoint endpoint, Object body);
Future<Object> asyncSendBody(String endpointUri, Object body);
Future<Object> asyncSendBody(Endpoint endpoint, Object body);
37.1.5. InOut パターンを使用した非同期リクエスト リンクのコピーリンクがクリップボードにコピーされました!
概要 リンクのコピーリンクがクリップボードにコピーされました!
非同期リクエスト メソッドは非同期送信メソッドと似ていますが、リクエストメソッドはメッセージ交換パターンを強制的に InOut にします (リクエスト/リプライセマンティクスに準拠)。そのため、プロデューサーエンドポイントから応答を受信することが予想される場合は、通常は非同期リクエストメソッドを使用することが推奨されます。
メッセージボディーの要求 リンクのコピーリンクがクリップボードにコピーされました!
リクエストと応答のメッセージボディーの内容のみに関心がある場合は、requestBody()
メソッドを使用してリクエストメッセージのボディーを引数として提供し、プロデューサーテンプレートにボディーをデフォルトのエクスチェンジオブジェクトに挿入させることができます。
asyncRequestBody()
メソッドを使用すると、エンドポイント URI または Endpoint
オブジェクトとして、ターゲットエンドポイントを指定することができます。Future
オブジェクトから取得できる戻り値は、リプライメッセージのボディー (Out メッセージボディー) です。これは、プレーン Object
として返されるか、組み込み型コンバーターを使用して特定タイプ T
に変換されます (「非同期呼び出し」 を参照)。
メッセージのボディーおよびヘッダーの要求 リンクのコピーリンクがクリップボードにコピーされました!
asyncRequestBodyAndHeader()
メソッドを使用して、単一のヘッダー値を設定する効果を試すことができます。メッセージボディーとヘッダー設定を引数として asyncRequestBodyAndHeader()
に提供し、プロデューサーテンプレートがボディーを挿入し、プロパティーをデフォルトのエクスチェンジオブジェクトに挿入できるようにします。
asyncRequestBodyAndHeader()
メソッドを使用すると、エンドポイント URI または Endpoint
オブジェクトとして、ターゲットエンドポイントを指定することができます。Future
オブジェクトから取得できる戻り値は、リプライメッセージのボディー (Out メッセージボディー) です。これは、プレーン Object
として返されるか、組み込み型コンバーターを使用して特定タイプ T
に変換されます (「非同期呼び出し」 を参照)。
asyncRequiestBodyAndHeaders()
メソッドは asyncRequestBodyAndHeader()
メソッドと似ていますが、単一のヘッダー設定を指定する代わりに、ヘッダー設定の完全なハッシュマップを指定することができます。
37.1.6. コールバックを使用した非同期送信 リンクのコピーリンクがクリップボードにコピーされました!
概要 リンクのコピーリンクがクリップボードにコピーされました!
プロデューサーテンプレートは、プロデューサーエンドポイントを呼び出すために使用される同じサブスレッドでリプライメッセージを処理するオプションも提供します。この場合、コールバックオブジェクトを作成します。このオブジェクトは、リプライメッセージが受信されるとすぐに自動的にサブスレッドで呼び出されます。つまり、コールバックメソッドを使用した非同期送信 により、メインスレッドで呼び出しを開始でき、(サブスレッドで非同期的に発生する) プロデューサーエンドポイントの呼び出し、応答の待機、応答の処理をすべて実行できます。
エクスチェンジの送信 リンクのコピーリンクがクリップボードにコピーされました!
基本的な asyncCallback()
メソッドは Exchange
引数を取り、指定されたエクスチェンジのメッセージ交換パターン (MEP) を使用してエンドポイントを非同期的に呼び出します。このメソッドはエクスチェンジの asyncSend()
メソッドと似ていますが、onComplete()
および onFailure()
という 2 つのメソッドを持つコールバックインターフェイスである org.apache.camel.spi.Synchronization
を追加の引数で必要とする点が異なります。Synchronization
コールバックの使用方法の詳細は、「コールバックを使用した非同期呼び出し」 を参照してください。
以下の asyncCallback()
メソッドを使用すると、エンドポイント URI または Endpoint
オブジェクトとして、ターゲットエンドポイントを指定することができます。
プロセッサーによって提供されたエクスチェンジの送信 リンクのコピーリンクがクリップボードにコピーされました!
プロセッサーの asyncCallback()
メソッドは、プロセッサーを呼び出してデフォルトのエクスチェンジの設定を行い、メッセージ交換パターンを強制的に InOut にします (よって呼び出しがリクエスト/リプライセマンティクスに従います)。
以下の asyncCallback()
メソッドを使用すると、エンドポイント URI または Endpoint
オブジェクトとして、ターゲットエンドポイントを指定することができます。
メッセージボディーの送信 リンクのコピーリンクがクリップボードにコピーされました!
送信するメッセージボディーの内容のみに関心がある場合は、asyncCallbackSendBody()
メソッドを使用してメッセージボディーを非同期的に送信し、プロデューサーテンプレートにボディーをデフォルトのエクスチェンジオブジェクトに挿入させることができます。
asyncCallbackSendBody()
メソッドを使用すると、エンドポイント URI または Endpoint
オブジェクトとして、ターゲットエンドポイントを指定することができます。
メッセージボディーの要求 リンクのコピーリンクがクリップボードにコピーされました!
リクエストと応答のメッセージボディーの内容のみに関心がある場合は、asyncCallbackRequestBody()
メソッドを使用してリクエストメッセージのボディーを引数として提供し、プロデューサーテンプレートにボディーをデフォルトのエクスチェンジオブジェクトに挿入させることができます。
asyncCallbackRequestBody()
メソッドを使用すると、エンドポイント URI または Endpoint
オブジェクトとして、ターゲットエンドポイントを指定することができます。