42.2. Producer インターフェースの実装
プロデューサーを実装する代替方法
プロデューサーは以下のいずれかの方法で実装できます。
同期プロデューサーの実装方法
例42.4「DefaultProducer 実装」 同期プロデューサーの実装方法を概説します。この場合、Producer.process() の呼び出しは応答を受け取るまでブロックします。
例42.4 DefaultProducer 実装
import org.apache.camel.Endpoint; import org.apache.camel.Exchange; import org.apache.camel.Producer; import org.apache.camel.impl.DefaultProducer; public class CustomProducer extends DefaultProducer { 1 public CustomProducer(Endpoint endpoint) { 2 super(endpoint); // Perform other initialization tasks... } public void process(Exchange exchange) throws Exception { 3 // Process exchange synchronously. // ... } }
概説では、process()メソッドは通常以下のように実装されます。
- エクスチェンジに In メッセージが含まれ、指定した交換パターンと一致する場合は、In メッセージを指定のエンドポイントに送信します。
-
交換パターンが Out メッセージの受信を予測する場合は、 Out メッセージが受信されるまで待ちます。これにより、通常、
process()メソッドは長時間ブロックします。 -
返信が受信されたら、エクスチェンジオブジェクトに返信を添付するために
exchange.setOut()を呼び出します。応答に障害メッセージが含まれる場合は、Out を使用してMessage.setFault(true)メッセージに fault フラグを設定します。
非同期プロデューサーの実装方法
例42.5「CollectionProducer 実装」 では、非同期プロデューサーの実装方法を概説します。この場合、同期の process() メソッドと非同期の process() メソッド (追加の AsyncCallback 引数を取る) の両方を実装する必要があります。
例42.5 CollectionProducer 実装
import org.apache.camel.AsyncCallback;
import org.apache.camel.AsyncProcessor;
import org.apache.camel.Endpoint;
import org.apache.camel.Exchange;
import org.apache.camel.Producer;
import org.apache.camel.impl.DefaultProducer;
public class _CustomProducer_ extends DefaultProducer implements AsyncProcessor { 1
public _CustomProducer_(Endpoint endpoint) { 2
super(endpoint);
// ...
}
public void process(Exchange exchange) throws Exception { 3
// Process exchange synchronously.
// ...
}
public boolean process(Exchange exchange, AsyncCallback callback) { 4
// Process exchange asynchronously.
CustomProducerTask task = new CustomProducerTask(exchange, callback);
// Process 'task' in a separate thread...
// ...
return false; 5
}
}
public class CustomProducerTask implements Runnable { 6
private Exchange exchange;
private AsyncCallback callback;
public CustomProducerTask(Exchange exchange, AsyncCallback callback) {
this.exchange = exchange;
this.callback = callback;
}
public void run() { 7
// Process exchange.
// ...
callback.done(false);
}
}- 1
org.apache.camel.impl.DefaultProducerクラスを拡張し、AsyncProcessor インターフェースを実装してカスタム非同期プロデューサークラス CustomProducer を実装します。- 2
- 親エンドポイントへの参照を取得するコンストラクターを実装します。
- 3
- 同期
process()メソッドを実装します。 - 4
- 非同期
process()メソッドを実装します。非同期メソッドは複数の方法で実装できます。ここでは、サブスレッドで実行されるコードを表すjava.lang.Runnableインスタンスであるtaskを作成する方法を示します。次に、Java スレッド API を使用してサブスレッドでタスクを実行します。たとえば、新しいスレッドを作成したり、既存のスレッドプールにタスクを割り当てたりして、これを行います。 - 5
- 通常、エクスチェンジが非同期的に処理されたことを示すために非同期
process()メソッドからfalseが返されます。 - 6
CustomProducerTaskクラスは、サブスレッドで実行される処理コードをカプセル化します。このクラスは、Exchangeオブジェクト (exchange) およびAsyncCallbackオブジェクト (callback) のコピーをプライベートメンバー変数として保存する必要があります。- 7
run()メソッドには、In メッセージをプロデューサーエンドポイントに送信し (ある場合)、応答を受信するのを待つコードが含まれます。応答 (Out メッセージまたは Fault メッセージ) を受信し、エクスチェンジオブジェクトに挿入した後、呼び出し元に処理の完了を通知するためにcallback.done()を呼び出す必要があります。