第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 flagtrue に設定する必要があります。

ExchangeHelper クラス

プロデューサーを実装するとき、org.apache.camel.util.ExchangeHelper ユーティリティークラスのメソッドを呼び出すと便利です。ExchangeHelper クラスの詳細は、「ExchangeHelper クラス」 を参照してください。