5

アクティブ化されていない一部のOSGiバンドルによって提供されるサービスの検出に問題があります。状況を説明させてください。

  • バンドルAはインターフェイスXを定義します
  • バンドルB、C、およびDは、インターフェイスXを実装するサービスを提供します
    • これらのバンドルのサービスはSpringDMを介して登録されるため、バンドルがアクティブ化され、SpringDMがバンドルで定義されたアプリケーションコンテキストを初期化した場合にのみ作成されます。
  • バンドルAがアクティブ化され、ある時点でインターフェイスXのサービスをサービスレジストリに要求します。バンドルB、C、およびDはアクティブ状態に移行されていないため(解決済みのみ)、何も見つかりません。

バンドルB、C、またはDを開始できないようです。したがって、それらのサービスを登録します。config.iniインターフェイスXを実装する(Eclipse p2のような更新メカニズムを介して)アプリケーションにインストールされるバンドルはいくつでも存在する可能性があるため、それらをに追加して開始するように強制することはできません。

このアプリケーションは、Spring2.5.6とSpringDM1.2.1を使用するEclipse3.5ベースのRCPアプリです。

これらのバンドルを強制的にアクティブ化するにはどうすればよいですか?

4

3 に答える 3

6

あなたが本当に持っているのは依存関係の階層性問題です。あなたが提案するハッキーな解決策は、実際には根本的な問題に対する単なるバンドエイドです。

あなたが本当に考慮すべきことはあなたのシステムのアーキテクチャです、あなたが持っているのは事実上循環依存です(再:あなたの元の投稿のコメントでの議論)。あなたは(好むと好まざるとにかかわらず)AがBとCからのサービスを必要とします(そしてある意味で依存します)。一方、BとCはAに直接依存しているため、Aが現れるまで開始できません。

最良の場合、Aの存在をリッスンするためにBとCでコードを書くことができますが、これはせいぜい(私が述べたように)根本的な問題を覆い隠します。あなたが本当に考慮すべきことは、Aを2つのバンドルに分割することです。それらをA1とA2と呼びましょう。

A1は、BとCが必要とするインターフェイスを提供する必要があります(依存します)。A2には、BとCが依存するサービスのリスナーが必要です。起動時に、BとCが必要なサービスである場合、A1を実行する必要がありますが、A2はいつでも開始でき、すべてが機能するはずです。

于 2010-01-08T01:41:57.247 に答える
0

少しハックな感じがしますが、私はこの問題の解決策を見つけたと思います。

私はこのスレッドに出くわしました。AdrianColyerは、バンドルがフレームワークにインストールされたときに、外部の「バンドルウォッチャー」がバンドルのアクティブ化を担当する可能性があることを示唆しました。

だから、私の解決策は次のとおりでした:

  • カスタムヘッダーを追加して、B、C、およびDのそれぞれのマニフェストをバンドルします(例:「MyApp-AutoStart:true」)。
  • バンドルがRESOLVED状態に移行したときに応答し、ヘッダーを探すバンドルリスナーを作成します
  • ヘッダーの値が「true」の場合、バンドルリスナーはbundle.start()

この方法を使用すると、開始したいバンドルは、を使用せずに開始され、自由にconfig.ini行き来できますが、照会するとサービスを利用できます。

于 2010-01-07T16:15:43.010 に答える
0

また、バンドルのディレクトリを監視し、バンドルを自動的にインストールして起動するfelixfileinstallもご覧ください。ファイルが削除されると、バンドルも停止され、アンインストールされます。

于 2010-02-09T10:29:35.323 に答える