コンセプトに頭を抱えるのが難しい。
独自の形式で着信メッセージをtcpポートでリッスンするエンドポイントを実装しようとしています。これにより、メッセージが変換され、キャメルが転送とルーティングを引き継ぐようになります。
プロデューサーがEndpoint
にメッセージを送信し、Consumer
がそのエンドポイントからメッセージを受信することを正しく理解しましたか?
インターフェイスを調べたところ、特にコンシューマー側で、それらのオブジェクト間のメッセージフローを理解できませんでした。 Consumer
はstart()
およびstop()
メソッドのみを定義します...
スケルトン実装でテストを設定するとき、Camel
はエンドポイントでcreateProducer()
を呼び出し、プロデューサーオブジェクトでprocess()
を呼び出しました。その後、コンシューマーまたはそれに関連付けられたプロセッサーを使用せずに戻りました。
誰かが私を正しい方向に向けることができますか?
最終的には、Streamコンポーネントを見ることでわかりました。
私は、エンドポイントを、すべてを実行しなければならない中心的なものとして考えるという間違いを犯したことがわかりました。
簡単な答えは、コンシューマは外部システムからデータを受信し(私の場合はサーバーソケットをリッスンします)、プロデューサは外部システムにデータを送信するということです。
私のエンドポイントは読み取り専用(キャメルルーティングプロセスの最終的な宛先としては使用されません)なので、プロデューサーは実際には必要ありません(システムの構成が間違っているために実行しようとすると、RuntimeExceptionをスローする必要があります)。適切な例は、キャメル原子のエンドポイントです。フィードを読み取ることはできますが、(1.6.0以降)公開することはできません。
同様に、外部システム(ログなど)からデータを受信しない書き込み専用エンドポイントのプロデューサーのみが必要です。
Endpoint
(つまりエンドポイントファクトリ)によって作成されたComponent
は、[]キャメルの終わりRoute
に配置できることを覚えておくことが重要です。 Componentをルートの先頭に置く場合、[]のConsumer
部分の実装が必要です。これは、特定の入力/要求(HTTP要求など)を汎用的なもの(キャメルExchange
)に変換する働きをしますRouteを下に移動できます。一方、コンポーネントをルートの最後に置く場合は、Producer
の実装が必要です。 ProducerはExchangeをrouteの最後から取得し、それを特定の何か(JMSメッセージなど)に変換する作業を行います。
Fuse ESBのドキュメントは Apache CamelのWebサイト よりも(一般的に)優れていると思います。 Fuse ESB Component page から:
コンシューマエンドポイントはリクエストを消費します。これらは常にルートの先頭に表示され、着信要求の受信と発信応答のディスパッチを担当するコードをカプセル化します。
Producer endpointsはリクエストを生成します。これらは常にルートの最後に表示され、発信要求のディスパッチと着信応答の受信を担当するコードをカプセル化します。
ProducerはProcessorを拡張します。つまり、Processメソッドも持っています。
Camel in Actionブックの無料の第1章をご覧ください。Camelのコンセプトについて少し説明しています。 http://www.manning.com/ibsen/
そして、このチュートリアルはそれらのコンセプトを着実に紹介しているので優れています http://camel.Apache.org/tutorial-example-reportincident.html