【发布时间】:2011-09-11 10:00:44
【问题描述】:
ServiceTracker 在 OSGI 4.2 规范中被定义为线程安全类
这个类的用法非常简单。
我可以在互联网上找到的大多数使用 ServiceTracker 的示例都显示了如下所示的 sn-p 代码:
ServiceInterface serviceObj = (ServiceInterface) serviceTracker.get();
if(serviceObj != null) {
// ...
// do smth with the serviceObject
// ...
}
现在我的问题是:一旦从 serviceTracker 中检索到服务实现对象,就不能保证它在空检查后立即可用(不会被删除)。
换句话说,即使在if-cycle内,服务对象(serviceObj)也很可能突然变为null(如果相应的服务未注册)
因此,我们应该始终像这样更正上面的代码:
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 In Action) 中没有任何示例讨论此要求...
我说的对吗?我错过了什么吗?
【问题讨论】:
标签: thread-safety osgi