web-dev-qa-db-ja.com

Apache Camelの生産者と消費者

コンセプトに頭を抱えるのが難しい。

独自の形式で着信メッセージをtcpポートでリッスンするエンドポイントを実装しようとしています。これにより、メッセージが変換され、キャメルが転送とルーティングを引き継ぐようになります。

プロデューサーがEndpointにメッセージを送信し、Consumerがそのエンドポイントからメッセージを受信することを正しく理解しましたか?

インターフェイスを調べたところ、特にコンシューマー側で、それらのオブジェクト間のメッセージフローを理解できませんでした。 Consumerstart()およびstop()メソッドのみを定義します...

スケルトン実装でテストを設定するとき、CamelはエンドポイントでcreateProducer()を呼び出し、プロデューサーオブジェクトでprocess()を呼び出しました。その後、コンシューマーまたはそれに関連付けられたプロセッサーを使用せずに戻りました。

誰かが私を正しい方向に向けることができますか?

31
Arnelism

最終的には、Streamコンポーネントを見ることでわかりました。

私は、エンドポイントを、すべてを実行しなければならない中心的なものとして考えるという間違いを犯したことがわかりました。

簡単な答えは、コンシューマは外部システムからデータを受信し(私の場合はサーバーソケットをリッスンします)、プロデューサは外部システムにデータを送信するということです。

私のエンドポイントは読み取り専用(キャメルルーティングプロセスの最終的な宛先としては使用されません)なので、プロデューサーは実際には必要ありません(システムの構成が間違っているために実行しようとすると、RuntimeExceptionをスローする必要があります)。適切な例は、キャメル原子のエンドポイントです。フィードを読み取ることはできますが、(1.6.0以降)公開することはできません。

同様に、外部システム(ログなど)からデータを受信しない書き込み専用エンドポイントのプロデューサーのみが必要です。

18
Arnelism

Endpoint(つまりエンドポイントファクトリ)によって作成されたComponentは、[]キャメルの終わりRouteに配置できることを覚えておくことが重要です。 Componentをルートの先頭に置く場合、[]Consumer部分の実装が必要です。これは、特定の入力/要求(HTTP要求など)を汎用的なもの(キャメルExchange)に変換する働きをしますRouteを下に移動できます。一方、コンポーネントルートの最後に置く場合は、Producerの実装が必要です。 ProducerExchangerouteの最後から取得し、それを特定の何か(JMSメッセージなど)に変換する作業を行います。

Fuse ESBのドキュメントは Apache CamelのWebサイト よりも(一般的に)優れていると思います。 Fuse ESB Component page から:

コンシューマエンドポイントはリクエストを消費します。これらは常にルートの先頭に表示され、着信要求の受信と発信応答のディスパッチを担当するコードをカプセル化します。

Producer endpointsはリクエストを生成します。これらは常にルートの最後に表示され、発信要求のディスパッチと着信応答の受信を担当するコードをカプセル化します。


enter image description here

46
chrisjleu

ProducerはProcessorを拡張します。つまり、Processメソッドも持っています。

Camel in Actionブックの無料の第1章をご覧ください。Camelのコンセプトについて少し説明しています。 http://www.manning.com/ibsen/

そして、このチュートリアルはそれらのコンセプトを着実に紹介しているので優れています http://camel.Apache.org/tutorial-example-reportincident.html

6
Claus Ibsen