46.4. プログラミングモデル
概要 リンクのコピーリンクがクリップボードにコピーされました!
API コンポーネントフレームワークのコンテキストでは、主なコンポーネント実装クラスは org.apache.camel.util.component パッケージのベースクラスから派生します。これらのベースクラスは、コンポーネントの実装時に (任意で) オーバーライドできるメソッドを定義します。このセクションでは、これらのメソッドと、コンポーネントの実装でこれらを使用する方法についての概要を説明します。
実装するコンポーネントメソッド リンクのコピーリンクがクリップボードにコピーされました!
生成されるメソッド実装 (通常は変更する必要はありません) のほかに、Component クラスの以下のメソッドの一部を任意で上書きすることもできます。
doStart()-
(任意) コールド起動時にコンポーネントのリソースを作成するためのコールバック。別の方法としては、遅延初期化 の設定 (リソースが必要な場合のみ作成) を実行する方法があります。実際、遅延初期化が最適なストラテジーとなることが多いため、
doStartメソッドは必要ないことがよくあります。 doStop()(任意) コンポーネントが停止している間にコードを呼び出すコールバック。コンポーネントを停止すると、そのリソースがすべてシャットダウンされ、内部状態が削除され、キャッシュが消去されることを意味します。
注記Camel は、対応する
doStartが呼び出されなかった場合でも、現在のCamelContextのシャットダウン時に 常にdoStopが呼び出されることを保証します。doShutdown-
(オプション)
CamelContextがシャットダウンしている間にコードを呼び出すコールバック。停止したコンポーネントを再起動することはできますが (コールドスタートのセマンティクスを使用)、シャットダウンするコンポーネントが完全に終了します。したがって、このコールバックは、コンポーネントに属するリソースを解放する最後の可能性を表します。
その他に Component クラスに実装するもの リンクのコピーリンクがクリップボードにコピーされました!
Component クラスは、コンポーネントオブジェクト自体に同じ(または同様の)ライフサイクルを持つオブジェクトへの参照を保持するための自然な場所です。たとえば、コンポーネントが OAuth セキュリティーを使用する場合、Component クラスで必要な OAuth オブジェクトへの参照を保持し、OAuth オブジェクトを作成するための Component クラスでメソッドを定義することが自然になります。
実装するエンドポイントメソッド リンクのコピーリンクがクリップボードにコピーされました!
生成されたメソッドの一部を変更し、必要に応じて、以下のように Endpoint クラスの継承されたメソッドの一部を上書きすることができます。
afterConfigureProperties()この方法で必要なのは、API 名に一致するプロキシークラス (API クラス) を作成することです。API 名(エンドポイント URI から抽出されている)は、継承された
apiNameフィールドまたはgetApiNameアクセサーを介して利用できます。通常、apiNameフィールドでスイッチを実行して、対応するプロキシークラスを作成します。以下に例を示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow getApiProxy(ApiMethod method, Map<String, Object> args)このメソッドを上書きして、
afterConfigurePropertiesで作成したプロキシーインスタンスを返します。以下に例を示します。@Override public Object getApiProxy(ApiMethod method, Map<String, Object> args) { return apiProxy; }@Override public Object getApiProxy(ApiMethod method, Map<String, Object> args) { return apiProxy; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 特殊なケースでは、API メソッドおよび引数に依存するプロキシーを選択する必要がある場合があります。必要に応じて、
getApiProxyで、このアプローチを柔軟に行うことができます。doStart()-
(任意) コールド起動時にリソースを作成するためのコールバック。
Component.doStart()と同じセマンティクスがあります。 doStop()-
(任意) コンポーネントが停止している間にコードを呼び出すコールバック。
Component.doStop()と同じセマンティクスがあります。 doShutdown-
(オプション) コンポーネントがシャットダウンしている間にコードを呼び出すコールバック。
Component.doShutdown()と同じセマンティクスがあります。 interceptPropertyNames(Set<String> propertyNames)(任意) API コンポーネントフレームワークは、エンドポイント URI と指定されたオプション値を使用して、呼び出す方法を決定します (オーバーロードおよびエイリアスによる曖昧さ)。ただし、コンポーネントが内部的にオプションまたはメソッドパラメーターを追加する場合、このフレームワークでは呼び出す適切な方法を判断するためにヘルプが必要になる場合があります。この場合、
interceptPropertyNamesメソッドを上書きし、プロパティーNamesセットに追加(非表示または暗黙的)オプションを追加する必要があります。メソッドパラメーターの完全なリストがpropertyNamesセットに提供されると、フレームワークは呼び出す適切なメソッドを特定できます。注記このメソッドは
Endpoint、Producer、またはConsumerクラスのレベルで上書きできます。基本的なルールは、オプションがプロデューサーエンドポイントとコンシューマーエンドポイントの 両方 に影響する場合に、Endpointクラスのメソッドを上書きします。interceptProperties(Map<String,Object> properties)(任意) このメソッドを上書きすると、API メソッドが呼び出される前に、オプションの実際の値を変更または設定できます。たとえば、この方法を使用して、必要に応じて、一部のオプションにデフォルト値を設定できます。実際には、
interceptPropertyNamesメソッドおよびinterceptPropertyメソッドの両方を上書きする必要があることが多いです。注記このメソッドは
Endpoint、Producer、またはConsumerクラスのレベルで上書きできます。基本的なルールは、オプションがプロデューサーエンドポイントとコンシューマーエンドポイントの 両方 に影響する場合に、Endpointクラスのメソッドを上書きします。
実装するコンシューマーメソッド リンクのコピーリンクがクリップボードにコピーされました!
任意で、以下のように Consumer クラスで継承されたメソッドの一部を上書きできます。
interceptPropertyNames(Set<String> propertyNames)-
(任意) このメソッドのセマンティクスは、
Endpoint.interceptPropertyNamesと似ています。 interceptProperties(Map<String,Object> properties)-
(任意) このメソッドのセマンティクスは、
Endpoint.interceptPropertiesと似ています。 doInvokeMethod(Map<String, Object> args)(任意) このメソッドを上書きすると、Java API メソッドの呼び出しを妨害できます。このメソッドを上書きする最も一般的な理由は、メソッド呼び出しに関するエラー処理をカスタマイズすることです。たとえば、以下のコードフラグメントに
doInvokeMethodを上書きする一般的な方法が示されています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow この実装の時点で、Java API メソッドが呼び出されるように、スーパークラスで
doInvokeMethodを呼び出す必要があります。interceptResult(Object methodResult, Exchange resultExchange)-
(任意) API メソッド呼び出しの結果に追加処理を行います。たとえば、この時点でカスタムヘッダーを Camel エクスチェンジオブジェクト
resultExchangeに追加できます。 Object splitResult(Object result)(任意) デフォルトでは、メソッド API 呼び出しの結果が
java.util.Collectionオブジェクトまたは Java アレイである場合、API コンポーネントフレームワークは結果を 複数 のエクスチェンジオブジェクトに分割します(これにより、単一の呼び出しの結果が複数のメッセージに変換されます)。デフォルトの動作を変更する場合は、コンシューマーエンドポイントで
splitResultメソッドを上書きすることができます。result引数には、API メッセージ呼び出しの結果が含まれます。結果を分割する場合は、配列タイプを返す必要があります。注記エンドポイント URI で
consumer.splitResult=falseに設定して、デフォルトの分割動作をオフにすることもできます。
実装するプロデューサーメソッド リンクのコピーリンクがクリップボードにコピーされました!
任意で、以下のように継承されたメソッドの一部を Producer クラスで上書きできます。
interceptPropertyNames(Set<String> propertyNames)-
(任意) このメソッドのセマンティクスは、
Endpoint.interceptPropertyNamesと似ています。 interceptProperties(Map<String,Object> properties)-
(任意) このメソッドのセマンティクスは、
Endpoint.interceptPropertiesと似ています。 doInvokeMethod(Map<String, Object> args)-
(任意) このメソッドのセマンティクスは、
Consumer.doInvokeMethodと似ています。 interceptResult(Object methodResult, Exchange resultExchange)-
(任意) このメソッドのセマンティクスは、
Consumer.interceptResultと似ています。
Producer.splitResult() メソッドは呼び出しされないため、API メソッドの結果を、コンシューマーエンドポイントの場合と同じ方法で分割することはできません。プロデューサーエンドポイントに同様の効果を取得するには、Camel の split( )DSL コマンド(標準のエンタープライズ統合パターンの 1 つ)を使用して Collection または配列の結果を分割できます。
コンシューマーポーリングおよびスレッドモデル リンクのコピーリンクがクリップボードにコピーされました!
API コンポーネントフレームワークのコンシューマーエンドポイントのデフォルトのスレッドモデルは、スケジュールされたポーリングコンシューマーです。これは、コンシューマーエンドポイントの API メソッドが、定期的なスケジュールされた時間間隔で呼び出されることを意味します。詳細は、「スケジュールされたポーリングコンシューマーの実装」 を参照してください。