2011-07-01 2 views
7

私のチームはOSGiに基づいた新しいシステムを開発しようとしています。今では50以上のバンドルとカウントがあります。問題は、バンドル間に依存関係があることです。たとえば、バンドルAの起動時にOSGiにサービスを登録し、バンドルBの起動時にそのサービスを使用します。したがって、バンドルBよりも前にバンドルAの起動が必要です。バンドルAの開始レベルをバンドルB未満に設定します。OSGiバンドル間の依存関係を管理するために、異なる開始レベルを使用することは合理的ですか?

サービスレベルの設定を避けるためにServiceTrackerを使用しようとしましたが、システム全体を管理し理解することが困難になります。

しかし、私はこの記事をインターネットで見つけました:OSGi and Start Levels

  • 開始レベル内のスタート順は不定である:私はそれで2つの文ではわかりません!
  • 全体として、開始レベルを操作するときは、開始順序に依存しないでください。開発レベルの問題ではなく、マネジメントの問題としてスタートレベルを考えてください。

開始レベルによって開始順序が決まるわけではありませんか?それではいつ使うべきですか?

OSGiバンドル間の依存関係を管理するために、異なる開始レベルを使用することは妥当ですか?

すべてのバンドルを動的モジュール(ServiceTrackerを使用して、使用するすべてのサービスを追跡)にすることは可能ですが、シニア開発者には時間がかかり、デバッグが難しくなります。

答えて

9

私の答えはベルトランと似て:あなたはあなたのソリューションのためのより高いレベルのコンポーネントベースの抽象化を使用することを検討すべきである:SCR、iPOJO、青写真、など

依存関係を制御するために、開始レベルを使用するには少し使用してのようなものです競合状態を修正するJavaのスレッド優先順位。確かに、あなたは、しばらくの間、物事を働かせるかもしれませんが、プロセスの中ではあなたは狂ってしまいます - とにかく、とにかく失われます。

開始レベルは、です。標準的な例は、コードをOSGiベースのGUIアプリケーションをバンドルに入れて起動画面を表示する必要がある場合です。開始レベルがなければ、スプラッシュ画面が表示されることを確実にする方法はありませんが、開始レベルを使用するとこれは簡単になります。

私は、サードパーティのバンドル(たとえばSpring)で見つかった依存関係の順序付けのバグを解決するために開始レベルを使用しましたが、これにはサービスの順序付けは含まれませんでしたが、 Spring Integrationカスタム名前空間)。

+0

私のチームは、同様の問題に対して開始レベルを使用しています。問題を見つけ出すには最適な方法ですが、根底にある問題を直ちに解決する時間がない場合は、短期的な解決策として役立ちます。 – Jon7

+0

+1 to rsteeleの答え。開始順序に応じて、非常に脆弱になります。開始レベルの別のユースケースは、最適化です。あなたのバンドルはどんな順序で起動されていても常に* WORK *する必要がありますが、バンドルは開始順序によっては多少の作業が必要になることがあります。したがって、開始レベルを使用してアプリのパフォーマンスを最適化できます。実際の機能には依存しないでください。 –

+0

ありがとうNeil。私は効率の問題を考慮していなかったが、多くの意味がある。 –

7

開始レベルを使用してサービス間の依存関係を管理することは悪い考えです。サービスコンポーネントランタイム(SCR)はこれを管理するよりはるかに優れた方法であり、すべての依存関係、起動順序、コンポーネントの再起動

Apache Felix SCRプラグイン(http://felix.apache.org/site/scr-annotations.html)は、Mavenを使用している場合、少数のJavaアノテーションを使用してSCR管理サービスを簡単に作成できます。 Apache Slingのコード(http://sling.apache.org)は、これを使った例がたくさんあります。

+0

私たちは、Mavenを使用していない、と私たちはフェリックスのではなく、春分のUE。それ以上の提案はありますか? –

+0

EquinoxはSCRに関する限り違いはないはずです.Mavenを使用していない場合は、Bndを直接使用できます(http://www.aqute.biz/Bnd/Bnd) - これは私が言及したMavenのプラグインですフードの下で使用してください。 –

関連する問題