ServiceTrackerが4.2スペックOSGI ServiceTrackerとスレッドの安全性
このクラスの使用はかなり単純ですOSGIにスレッドセーフなクラスとして定義されます。
私はインターネット上で見つけることができるServiceTrackerを採用した例のほとんどは、次のようなコードのスニペットを示しています。
ServiceInterface serviceObj = (ServiceInterface) serviceTracker.get();
if(serviceObj != null) {
// ...
// do smth with the serviceObject
// ...
}
今私の質問は:サービス実装オブジェクトがserviceTrackerから取得されると、そこにありますヌルチェックの直後に利用可能(削除されない)になることは保証されません。すなわち
は、たとえサイクル内で、サービスオブジェクト(serviceObj)は非常によく突然ヌルになることができる(対応するサービスが未登録の場合)
したがって、我々は、常にこのような上記のコードを修正する必要があります。これにもかかわらず
ServiceInterface serviceObj = (ServiceInterface) serviceTracker.get();
if(serviceObj != null) {
try {
// ...
// do smth with the serviceObject
// ...
} catch(Throwable th) {
// a null-pointer exception may have occurred here!!
}
}
のいずれかのブログ(http://developers-blog.org/blog/default/2010/03/31/OSGI-Tutorial-How-to-use-ServiceTracker-to-get-Services)や書籍(アクションでOSGI)には例がこの要件について話をしない、...
は、私は右ですか?何か不足していますか?
回答ありがとうございます –
Re:null。あなたはnull値の問題について興味深い点を挙げました。あなたは正しい:ローカル変数はそのスコープの外で変更することはできません。したがって、参照**は範囲外になるまで**有効のままです。今私がOsgiについて読んだことは、サービスレジストリを照会することによって得られる参照は、実際のサービス実装クラス(Javaクラス)にすぎないということです。したがって、私のコードは常に動作し、if-cycleの例外は投げられるべきではありません...私はここで何が欠けていますか? –
PS:私の経験ではなく、少なくとも1回Null Pointer例外が発生しました –