質問
は、それが無効化になるのでしょうか?
私の最初のテストでは、サービスバンドルは、OSGiのの動的な性質の私の理解を矛盾する、停止した後も、サービスインスタンスを使用することができることを示します。
私は、これは実際に、それは新しいインスタンスを作成しないんのOSGiコンテナ内の別のバンドルから(ServiceTracker経由)サービスを取得するものに帰着するか、それはあなたのコンテナに登録されているインスタンスへのポインタを与えないと仮定しますか?
サービスが停止された後にサービスインスタンスを使用して任意の危険性はありますか?
解決
これは、私は決定的な答えの検索で仕様に掘っ非常に良い質問です。これは、この問題について話して、全体のセクションがあることが判明 - セクションの 5.4古い文献を見るにはの<のhref = "http://www.osgi.org/Download/Fileの132ページから始まりますか? URL = /ダウンロード/ r4v42 / r4.core.pdf」のrel = "noreferrer">のOSGiサービスプラットフォームコア仕様は、4バージョン4.2 にリリースます。
仕様に従って、あなたの質問に答えるために:
未登録となっサービスの動作は未定義です。このようなサービス 正常に動作またはその裁量で例外をスローし続ける可能性があります。
、潜在的な問題を防ぐために:
バンドルは、クリーンアップし、古い削除するためにフレームワークによって生成されたイベントに耳を傾ける必要があります 参考文献ます。
仕様では、古くなった参照の影響を最小限にする方法をいくつかのヒントを与えます。
他のヒント
あなたは正しいです。私は、OSGiコンテナとサービスの異なる実装自体が異なる動作をするかもしれないが、サービスが、利用可能になる保証がないと信じています。
サービスが作成され、スプリングDMに登録された場合は、たとえば、次に検索サービスは、実際には、基礎となる実装にスプリングベースのプロキシであり、実装はまだ消滅することができます。このような実装を直接参照サービス参照は、プロキシベースの基準ではないだろう。
一方、除去されることから、そのオブジェクトを保持することができますOSGiの仕様は言う:
バンドルが表示されているエンティティです 通常のアプリケーション・プログラミングインチために たとえば、バンドルが停止した場合、すべての そのサービスは登録解除されます。
だから、停止したバンドルからサービスを受けることができないはずです。しかし、技術的には、少なくとも限り、あなたはサービスオブジェクトへの参照を保持するように、それを使用することも可能である(誰もがあなたから離れてそれを取ることはできません、それはGC'dではありません)。しかし、私はサービスを利用するために保存されていることはないと思います。これは、バンドルが停止した後に利用可能ではない他のバンドルリソースに依存してもよい。
は、OSGiサービスのインスタンスがしたら バンドル・コンテキストから取得し それはときに、サービス無効になって 停止している?
いいえ、参照自体が無効化になっていません。コンテナ内の何かがそれを保持している限り、それはまたGC'edすることはできません。
しかし、それはまだ有用であろうかどうかにかかわらず、唯一のサービスの実装自体ではなく、コンテナに依存します。
私の最初のテストでは、サービスインスタンスでもサービスバンドルの後に使用することができることを示している>のOSGiの動的な性質の私の理解を矛盾する、停止されます。
仕様自体は、そのような参照が開催されるべきでないことを示しているが、それは正しく仕様を実装するための世話をするために実装次第です。あなたが実装し、仕様に従って正しく動作しませんバンドルを展開できるという事実のみが存在し、矛盾がないことを意味します。
私は、これは別のバンドルから(ServiceTracker経由)サービスを取得するものに帰着すると仮定します OSGiコンテナで実際に、それは新しいインスタンスを作成しない場合、またはそれはあなたのポインタを与えるん コンテナに登録されているインスタンスに?
コンテナは、関与のServiceFactoryは(仕様を参照)がある場合を除いて、サービスの新しいインスタンスを作成しません。サービスを見ると、常に容器の中にあなたの登録したインスタンスへのポインタを与える必要があります。
サービスが停止された後にサービスインスタンスを使用して任意の危険性はありますか?
唯一のサービスの実装に依存していること。しかし、バンドルにそうすることによって、あなたは自動的仕様に準拠していないバンドルを作成します。
実際には、多くのサービスは、リソースや参照を解放するために実装されており、もはや適切に応答しなくなります。
サービスが停止された後、サービスインスタンスを使用するのは危険であるかどうか、あなたの質問について。 4.2コア仕様(5.4古い参照)から引用する:
となっサービスの動作 未登録は未定義です。そのような サービスが正常に動作し続けることが またはその時に例外をスロー 裁量ます。
私はここの仕様のセクション全体を引用したくないが、以下の文章は、古い参照を使用しての危険性についての良い議論されます:
失効参照が属するJavaオブジェクトへの参照であります 停止しているか関連している束のクラスローダへ 未登録であるサービスオブジェクトを持ちます。標準のJavaにはありません 古い参照をクリーンアップするために、任意の一般的な手段を提供し、そしてバンドル 開発者は、その古いを確保するために慎重に自分のコードを分析する必要があります 参照が削除されます。
彼らは、Javaを妨げるので、古い参照が潜在的に有害です クラス、そしておそらくインスタンスを収穫からガベージコレクタ、 バンドルを停止しました。これは、大幅に増加メモリをもたらすことができます 使用状況や失敗するネイティブコードライブラリの更新を引き起こす可能性があります。使用したバンドル サービスは強くいずれかのサービスのトラッカーを使用することをお勧めしますか 宣言型サービスます。
サービス参照は、参照として保持すべきではありません。あなたは、常に、実行時にサービスをアップしているはずです。これは、あなたが常に望んでいたではないwhihc、しかしOSGI APIに結び付けます。
を見てください - OSGIのserviceTracker - OSGI宣言型サービス - OSGIブループリント - 春のDM - Peaberry - iPojo
これは、すべて使用するには、no OSGI APIを使用すると、あなたのためのダイナミズムのそれらのほとんどの世話をします。
よろしく、
LEEN Toelen