第42章 Producer インターフェイス
概要
この章では、Apache Camel コンポーネントの実装における必須ステップである Producer インターフェイスを実装する方法を説明します。
42.1. Producer インターフェイス
概要
org.apache.camel.Producer タイプのインスタンスは、ルートのターゲットエンドポイントを表します。プロデューサーのロールは、リクエスト (In メッセージ) を特定の物理エンドポイントに送信し、対応する応答 (Out または Fault メッセージ) を受信することです。Producer
オブジェクトは、基本的にプロセッサーチェーン (ルートと同等) の最後に出現する特別な種類の Processor
です。プロデューサーの継承階層を 図42.1「プロデューサーの継承階層」 に示します。
図42.1 プロデューサーの継承階層
Producer インターフェイス
例42.1「Producer インターフェイス」 は、org.apache.camel.Producer
インターフェイスの定義を示しています。
例42.1 Producer インターフェイス
package org.apache.camel; public interface Producer extends Processor, Service, IsSingleton { Endpoint<E> getEndpoint(); Exchange createExchange(); Exchange createExchange(ExchangePattern pattern); Exchange createExchange(E exchange); }
プロデューサーメソッド
Producer インターフェイスは以下のメソッドを定義します。
-
process()
(プロセッサーから継承): 最も重要なメソッドです。プロデューサーは、エクスチェンジオブジェクトを別のプロセッサーに転送する代わりに、リクエストをエンドポイントに送信する特別なタイプのプロセッサーです。process()
メソッドを上書きすることで、プロデューサーが関連するエンドポイントとの間でメッセージを送受信する方法を定義します。 -
getEndpoint()
: 親エンドポイントインスタンスへの参照を返します。 -
createExchange()
: これらのオーバーロードされたメソッドは、Endpoint インターフェイスで定義された対応するメソッドに類似しています。通常、これらのメソッドは親エンドポイントインスタンスで定義された対応するメソッドに委譲されます (これはデフォルトでDefaultEndpoint
クラスが実行するものです)。時折、これらのメソッドを上書きする必要がある場合があります。
非同期処理
プロデューサーでエクスチェンジオブジェクトを処理します。これは通常、リモートの宛先にメッセージを送信し、応答を待つことを含みます。そのためプロデューサーは、長時間ブロックする可能性があります。現在のスレッドをブロックしないようにするには、プロデューサーを 非同期プロセッサー として実装できます。非同期処理パターンは、前述のプロセッサーをプロデューサーから切り離し、process()
メソッドは遅延なく返却されます。「非同期処理」 を参照してください。
プロデューサーを実装する場合、org.apache.camel.AsyncProcessor インターフェイスを実装して非同期処理モデルをサポートすることができます。それ自体では、非同期処理モデルが使用される訳ではありません。また、チェーン内で前述のプロセッサーを使用して process()
メソッドの非同期バージョンを呼び出す必要もあります。AsyncProcessor インターフェースの定義は 例42.2「AsyncProcessor インターフェイス」 に示されています。
例42.2 AsyncProcessor インターフェイス
package org.apache.camel; public interface AsyncProcessor extends Processor { boolean process(Exchange exchange, AsyncCallback callback); }
process()
メソッドの非同期バージョンは、org.apache.camel.AsyncCallback 型の追加の引数である callback
を取ります。対応する AsyncCallback インターフェースは、例42.3「AsyncCallback インターフェイス」 に従って定義されます。
例42.3 AsyncCallback インターフェイス
package org.apache.camel; public interface AsyncCallback { void done(boolean doneSynchronously); }
AsyncProcessor.process()
の呼び出し元は、処理が完了した通知を受信する AsyncCallback の実装を提供する必要があります。AsyncCallback.done()
メソッドは、処理が同期的に実行されたかどうかを示すブール値引数を取ります。通常、フラグは false
で非同期処理であることを示します。ただし、プロデューサーが (要求されたにもかかわらず) 非同期的に処理 しない ようにすることにも意味があります。たとえば、プロデューサーがエクスチェンジの処理がすぐに完了することを認識している場合は、同期して処理を行い、最適化できます。この場合、doneSynchronous flag
は true
に設定する必要があります。
ExchangeHelper クラス
プロデューサーを実装するとき、org.apache.camel.util.ExchangeHelper
ユーティリティークラスのメソッドを呼び出すと便利です。ExchangeHelper
クラスの詳細は、「ExchangeHelper クラス」 を参照してください。