42.2. Producer インターフェイスの実装
プロデューサーを実装する代替方法 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
プロデューサーは以下のいずれかの方法で実装できます。
同期プロデューサーの実装方法 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
例42.4「DefaultProducer 実装」 は、同期プロデューサーの実装方法の概要を説明しています。この場合、Producer.process()
の呼び出しは応答を受け取るまでブロックします。
例42.4 DefaultProducer 実装
概説では、process()
メソッドは通常以下のように実装されます。
- エクスチェンジに In メッセージが含まれ、指定した交換パターンと一致する場合は、In メッセージを指定のエンドポイントに送信します。
-
交換パターンが Out メッセージの受信を予測する場合は、 Out メッセージが受信されるまで待ちます。これにより、通常、
process()
メソッドは長時間ブロックします。 -
返信が受信されたら、エクスチェンジオブジェクトに返信を添付するために
exchange.setOut()
を呼び出します。応答に障害メッセージが含まれる場合は、Out を使用してMessage.setFault(true)
メッセージに fault フラグを設定します。
非同期プロデューサーの実装方法 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
例42.5「CollectionProducer 実装」 に非同期プロデューサーを実装する方法を概説します。この場合、同期の process()
メソッドと非同期の process()
メソッド (追加の AsyncCallback
引数を取る) の両方を実装する必要があります。
例42.5 CollectionProducer 実装
- 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()
を呼び出す必要があります。