3

Karafの2.2.8バージョン(そしておそらく以前のバージョンでも)で問題が発生します。

Karafを使用して、動的にデプロイされたバンドルでシステムをホストします。バンドルはユーザーによって展開され、私はそれらがどれであるかを事前に知ることができません。

BundleActivator.start()の順序は、バンドル間のパッケージの依存関係(インポート/エクスポートパッケージの依存関係)に正確に対応し、bundle1が開始される前にbundle0が完全に初期化されると想定しても安全であると期待しています。 。しかし、そうではありません。BundleActivator.start()は「ランダムな」順序で呼び出され、バンドル間のパッケージの依存関係を無視しているようです。

サンプルのユースケース、3つのライブラリがあります

test-lib0 - defines testlib0.ITestRoot, exports testlib0 package 
test-lib1 - defines testlib1.TestRoot implements ITestRoot,  exports testlib1 package 
test-lib2 - uses both libs, ITestRoot and TestRoot 

Karafを起動すると、コンソールに次のサンプル出力が表示されます

karaf@root> TestLib1Activator.start() 
TestLib2Activator.start() 
        ITestRoot: interface com.testorg.testlib0.ITestRoot - 16634462 
        TestRoot:  class com.testorg.testlib1.TestRoot - 21576551 
TestLib0Activator.start() 

しかし、私はそれが常にこの順序でなければならないと思います

TestLib0Activator.start() 
TestLib1Activator.start() 
TestLib2Activator.start() 
        ITestRoot: interface com.testorg.testlib0.ITestRoot - 16634462 
        TestRoot:  class com.testorg.testlib1.TestRoot - 21576551 

テスト用のサンプルプロジェクトを添付しています。テストケース:「mvninstall」の後、jarを./deployフォルダーからKarafの同じフォルダーに移動すると、コンソールにトレースメッセージが表示されます。(注:最初の試行から正しく機能する可能性があります。もう一度試してください:))

サンプルテストプロジェクト http://karaf.922171.n3.nabble.com/file/n4025256/KarafTest.zip

注:これはhttp://karaf.922171.n3.nabble.com/What-is-the-natural-start-order-for-dependent-bundle-td4025256.htmlからのクロスポストです。

4

1 に答える 1

6

OSGiでは、バンドルのライフサイクルはinstalled→→→resolvedです。startingstarted

Import-PackageとExport-Packageは、バンドルがからinstalledに移行するときにのみ影響しresolvedます。したがって、フレームワークは、パッケージをインポートするすべてのバンドルがバンドルの前に解決されることを確認しますが、その後、バンドルは解決された状態になるだけです。次に、2番目のステップでアクティベーターが呼び出されます。したがって、アクティベータが同じ順序で呼び出されると想定することはできません。testlib2が機能する前に初期化が必要な場合は、OSGiサービスを使用する必要があります。

したがって、私があなたのケースを正しく理解した場合、testlib0はインターフェースを定義し、testlib1はそれを実装し、testlib2はその実装を使用したいと考えています。したがって、これを実現する最善の方法は、implをOSGiサービスとしてtestlib1で公開し、このサービスをtestlib3で参照することです。その後、ServiceTrackerまたはブループリントなどでサービスを使用できます。これを示す小さな例があります:http ://www.liquid-reality.de/x/DIBZ 。したがって、私の例のようにケースを実行する場合、ブループリントは、サービスが存在する場合にのみtestlib2のコンテキストが開始されることを確認します。サービスが終了すると、testlib2も停止します。

于 2012-07-20T07:16:20.023 に答える