OSGi コンテナのシャットダウンに関するベスト プラクティスを探しています。
現在、EclipseStarter.startup() を呼び出していくつかのコア バンドルをインストールする小さなランチャー アプリを使用しています。その後、ランチャーは終了します。
テスト GUI (バンドルとして実行) が閉じられると、System.exit(0) が呼び出されてコンテナーがシャットダウンされますが、これよりも洗練されたソリューションが必要です。
ありがとう
OSGi フレームワークをシャットダウンするために System.exit(0) を使用しないでください。ID 0 のバンドル (システム バンドル) を停止してください。このようにして、すべてのバンドルを整然とシャットダウンする機会を与えます (たとえば、リソースを解放するなど)。
OSGi 仕様では、次のように定義されています (コア仕様、R4.x、4.2.6 フレームワークの停止)。
シャットダウンは、システム バンドルを停止するか [...]、フレームワーク オブジェクトで stop メソッドを呼び出すことによって開始できます。
その章では、フレームワークがシャットダウンされたときに何が起こるかについて詳細に説明しています。
システム バンドル resp。フレームワーク オブジェクトも定義されます (第 4.6 章 システム バンドル)。
システム バンドルは、フレームワークが起動されたときのフレームワーク オブジェクトに似ていますが、実装では、フレームワーク オブジェクトとシステム バンドルに同じオブジェクトを使用する必要はありません。ただし、両方のオブジェクトのバンドル ID が 0、同じ場所、およびバンドル シンボリック名である必要があります。
OSGi 仕様は、OSGi Alliance の Web サイト ( http://www.osgi.org/Specifications/HomePage )で無料で入手できます。
私は通常、次のようにフレームワークを終了します:
bundlecontext.getBundle(0).stop();
ID = 0 のバンドルはシステム バンドルです。
また、アプリケーション組み込みコンテキストでEquinoxを使用し、システムバンドルでstop()を呼び出し、その後EclipseStarter.shutdown()でフォローアップします。すべてのバンドルを停止する必要がある場合があります。
保持された状態がないため、アプリケーションのバンドルのシャットダウンについて実際に心配したことはありません。
これを行う標準的な方法はまだありません。OSGI は次のリリースでこの部分を標準 API にする予定ですが、すべての OSGI コンテナーがこれを実装するまでにはしばらく時間がかかると思います。今のところコンテナー固有のコードを使用しますが、System.exit() は避けてください。
よろしく、
リーン・トーレン