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)を呼び出すことで行われます。
-
ルートのコンシューマーは、すべての応答を呼び出し元に書き込みます (