1

ショートバージョン:CamelContext単一のJettyサーバーが着信リクエストを個別のバンドルにルーティングできるように 、個別のOSGiバンドル(サポートするプロセスを含む)で定義された複数のCamelルートを単一に共有/マージする方法はありますか?

背景: 実際の要件は機密であるため、これは架空の要件です...

私はウェブサイト用のモジュラー API バックエンドを構築しています。最初のフェーズでは単純な顧客登録を実装し、2 番目のフェーズではフォーラムのようなシステムを実装し、3 番目のフェーズでは wiki のようなシステムを実装します。各システムの開発が完了すると、他のコンポーネントを変更したり (理想的には) システムをオフラインにしたりせずに、新しいシステムを API バックエンドに追加できる必要があります。

このようなものを実装しようとして、私は各 API システムを独自の OSGi バンドルに入れ、Camel と Jetty を使用して着信 API 要求を処理し、各システムが jetty ベース URL の下にパスを登録し、それ宛てのメッセージを受信することを考えました。 Camelルーティングメカニズムから。この設計で問題が発生しました。各バンドルでルートを構成すると、それらは別々CamelContextの で動作するため、最初のバンドルは実行されますが、2 番目のバンドルは同じポートで別の Jetty サーバーを生成しようとして失敗します。

RouteBuilder次に、既存の「マスター」CamelContext( suspendaddRoutes、 )を取得して追加する OSGi サービスを作成しresumeます。マスターCamelContextは個別の API バンドル内のサービス/プロセスを認識しないため、これは機能しません。また、XML ベースの構成も許可されていません。

私は問題を解決するさまざまな方法を受け入れます。

4

4 に答える 4

1

jetty コンポーネントの代わりに servlet コンポーネントを使用するだけです。OSGi HTTPService にサーブレットを登録できます。次に、すべてのサーブレット ルートがこのサーブレットを使用し、独自のサブパスを登録できます。これはバンドル全体で機能し、問題を解決するはずです。

于 2012-11-19T07:20:39.983 に答える
0

OSGi では、同じポート番号を使用する場合、Jetty サーバーは Camel バンドル間で共有されます。これにより、新しい Camel ルートを個別のバンドルにインストールし、それぞれに独自のライフサイクルを持たせることができるため、必要に応じてバンドルをインストール/アンインストールできます。

はい、クリスチャンも言っているように、代わりに camel-servlet を使用できます。次に、OSGi HTTP サービスを使用します。Apache ServiceMix / Karaf では、Jetty をサーブレット コンテナーの実装として使用しています。ServiceMix/Karaf の etc ディレクトリにある構成ファイルで、jetty 構成を構成できます。

于 2012-11-19T08:58:56.967 に答える
0

同じポート番号を使用してください。

これにより、別の疑問が生じます。

桟橋が共有されている場合、最小/最大スレッドをどのように制御できますか。

例:

routeA.xml で:

<from uri="jetty:http://0.0.0.0:9191/proxy/serviceA/?maxThread=20">
...

routeB.xml で:

<from uri="jetty:http://0.0.0.0:9191/proxy/serviceB/?maxThread=50">
...

どの構成が有効になりますか?

于 2012-12-04T04:13:32.160 に答える
0

ああ、ちょっとトリッキーだと思います。

クライアント バンドルでは、OSGi サービス レジストリを使用して、ルートを持つ RouteBuilder クラスのサービスをエクスポートできると思います。

たとえば、ブループリント xml ファイルを使用して、これらのルート ビルダーを OSGi サービスとしてエクスポートできます。次に、Camel コンテキストを含むバンドルで、これらのサービスを参照できます。これは、CamelContext から参照できます。

<!-- osgi references goes here -->

<camelContext ...>
  <routeBulderRef ref="myClientRoute"/>
  <routeBulderRef ref="myOtherClientRoute"/>
   ...
</camelContext>

クライアント ルートに XML DSL を使用する場合は、少し注意が必要です。<routeContext id="myClientRoute">ブループリントの XML ファイルを使用できます。ただし、OSGi サービスとしてエクスポートする方法は難しい場合があります。

何らかの方法<routeContext>で、OSGi サービスとして登録することもできたはずです。>のためにこれを行い<camelContextます。

于 2012-11-18T11:52:51.253 に答える