39.2. Component インターフェイスの実装
DefaultComponent クラス リンクのコピーリンクがクリップボードにコピーされました!
org.apache.camel.impl.DefaultComponent
クラスを拡張して新しいコンポーネントを実装します。これにより、一部のメソッドに標準機能とデフォルトの実装が提供されます。特に、DefaultComponent
クラスは URI 解析と スケジュール済みエグゼキューター の作成をサポートします (スケジュールされたポーリングパターンに使用されます)。
URI の解析 リンクのコピーリンクがクリップボードにコピーされました!
ベースコンポーネントインターフェイスで定義される createEndpoint(String uri)
メソッドは、完全かつ解析されていないエンドポイント URI を唯一の引数として取ります。一方、DefaultComponent
クラスは、以下の署名で createEndpoint()
メソッドの 3 つの引数バージョンを定義します。
uri
は、元の解析されていない URI です。remaining
は、開始時にコンポーネント接頭辞を削除し、最後のクエリーオプションを削除した後に残る URI の一部で、parameters
は解析されたクエリーオプションが含まれます。createEndpoint()
から継承時に上書きする必要があるのは、DefaultComponent
メソッドのこのバージョンです。これには、エンドポイント URI がすでに解析されているという利点があります。
次の file
コンポーネントのサンプルエンドポイント URI は、URI 解析の仕組みを示しています。
file:///tmp/messages/foo?delete=true&moveNamePostfix=.old
file:///tmp/messages/foo?delete=true&moveNamePostfix=.old
この URI では、引数が 3 つのバージョンの createEndpoint()
に以下の引数が渡されます。
引数 | サンプル値 |
---|---|
| |
|
|
|
2 つのエントリーが
|
パラメーターの注入 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、URI クエリーオプションから抽出されたパラメーターはエンドポイントの Bean プロパティーに注入されます。DefaultComponent
クラスは、ユーザーのパラメーターを自動的に注入します。
たとえば、2 つの URI クエリーオプション (delete
および moveNamePostfix
) をサポートするカスタムエンドポイントを定義する場合などです。エンドポイントクラスで対応する Bean メソッド (getter と setter) を定義するだけです。
URI クエリーオプションを コンシューマーパラメーター に注入することもできます。詳細は、「コンシューマーパラメーターの注入」 を参照してください。
エンドポイントパラメーター注入の無効化 リンクのコピーリンクがクリップボードにコピーされました!
Endpoint
クラスにパラメーターが定義されていない場合は、エンドポイントパラメーターの注入を無効にすることで、エンドポイント作成のプロセスを最適化できます。エンドポイントでパラメーターの注入を無効にするには、以下のように useIntrospectionOnEndpoint()
メソッドを上書きし、false
を返すように実装します。
protected boolean useIntrospectionOnEndpoint() { return false; }
protected boolean useIntrospectionOnEndpoint() {
return false;
}
useIntrospectionOnEndpoint()
メソッドは、Consumer
クラスで実行される可能性のあるパラメーターの注入には影響しません。このレベルのパラメーターの注入は Endpoint.configureProperties()
メソッドによって制御されます (「エンドポイントインターフェイスの実装」 を参照)。
スケジュール済みエグゼキューターサービス リンクのコピーリンクがクリップボードにコピーされました!
スケジュールされたエグゼキューターは、スケジュールされたポーリングパターンで使用されます。ここでは、コンシューマーエンドポイントの定期的なポーリングを行います (スケジュール済みエグゼキューターは、実質的にスレッドプールの実装です)。
スケジュールされたエグゼキューターサービスをインスタンス化するには、CamelContext.getExecutorServiceStrategy()
メソッドによって返される ExecutorServiceStrategy
オブジェクトを使用します。Apache Camel スレッドモデルの詳細は、「スレッドモデル」 を参照してください。
Apache Camel 2.3 以前、DefaultComponent
クラスはスレッドプールインスタンスを作成するための getExecutorService()
メソッドを提供していました。ただし、2.3 以降、スレッドプールの作成は ExecutorServiceStrategy
オブジェクトによって集中管理されるようになりました。
URI の検証 リンクのコピーリンクがクリップボードにコピーされました!
エンドポイントインスタンスを作成する前に URI を検証する場合は、以下の署名を持つ DefaultComponent
クラスから validateURI()
メソッドを上書きすることができます。
protected void validateURI(String uri, String path, Map parameters) throws ResolveEndpointFailedException;
protected void validateURI(String uri,
String path,
Map parameters)
throws ResolveEndpointFailedException;
提供された URI に必要な形式がない場合は、validateURI()
の実装によって org.apache.camel.ResolveEndpointFailedException
例外が発生するはずです。
エンドポイントの作成 リンクのコピーリンクがクリップボードにコピーされました!
例39.2「createEndpoint()
の実装」 では、オンデマンドでエンドポイントインスタンスを作成する DefaultComponent.createEndpoint()
メソッドの実装方法を概説します。
例39.2 createEndpoint()
の実装
例 リンクのコピーリンクがクリップボードにコピーされました!
例39.3「FileComponent 実装」 は、FileComponent
クラスの実装例を示しています。
例39.3 FileComponent 実装
- 1
- クラスの自動インスタンス化を容易にするために、コンポーネントクラスの引数なしコンストラクターを常に定義します。
- 2
- プログラミングでコンポーネントを作成する際に、親の
CamelContext
インスタンスを引数として取るコンストラクターが便利です。 - 3
FileComponent.createEndpoint()
メソッドの実装は、例39.2「createEndpoint()
の実装」 に記載のパターンに従います。実装によりFileEndpoint
オブジェクトが作成されます。
SynchronizationRouteAware インターフェイス リンクのコピーリンクがクリップボードにコピーされました!
SynchronizationRouteAware
インターフェイスを使用すると、エクスチェンジがルーティングされる前および後にコールバックを指定できます。
-
onBeforeRoute
: エクスチェンジが指定のルートによってルーティングされる前に呼び出されます。ただし、ルートの起動後にSynchronizationRouteAware
実装をUnitOfWork
に追加した場合、このコールバックは呼び出されないことがあります。 onAfterRoute
: エクスチェンジが指定のルートによってルーティングされた後に呼び出されます。ただし、エクスチェンジが複数のルートでルーティングされる場合は、ルートごとにコールバックを生成します。この呼び出しは、以下のコールバックの前に行われます。
-
ルートのコンシューマーは、すべての応答を呼び出し元に書き込みます (
InOut
モードの場合)。 -
UnitOfWork
は、Synchronization.onComplete(org.apache.camel.Exchange)
またはSynchronization.onFailure(org.apache.camel.Exchange)
を呼び出すことで行われます。
-
ルートのコンシューマーは、すべての応答を呼び出し元に書き込みます (