说我正在使用在另一个service A
中导入的service B
。虽然B
正常运行(当然A
处于活动状态),但service A
在service B
仍在运行时会发生Service A -> Service B
会发生什么?
的 ServiceReference
如果我使用ServiceTracker
,DS
& {{1}}?
答案 0 :(得分:3)
当在OSGi中取消发布服务时,会向当前使用该服务的所有包发送一个事件,告诉他们应该停止使用该服务。
如果您使用的是DS,则会调用您的unbind方法。在调用它时,您应尽最大努力尽快停止使用该服务。但最终OSGi是一个合作系统,它不能强制你发布服务。但是,如果不这样做,则可能会导致问题,例如服务发布者不会被完全垃圾收集。你最终破坏了OSGi平台的动态,可能会造成内存泄漏等等。
如果您使用的是ServiceTracker
,则会调用removedService
方法,您需要以相同的方式响应。但是我不是在另一个问题中告诉你不要使用ServiceTracker
?? ; - )
如果您使用ServiceReference
,则需要明确注册ServiceListener
才能接收这些事件。这就是为什么你真的真的不应该使用这个低级API,直到你获得了更多的经验(并且一旦你有这种经验,你也不会想要使用它!)
答案 1 :(得分:2)
首先:OSGi的一个优点是明确规定了框架和标准服务的行为。这些规格可以从OSGi Alliance web site下载,或者,如果您不喜欢阅读PDF,请订购打印。您要问的问题在这些规范中得到了完美的回答。
总而言之:当服务未注册时:
ServiceReference
对象保持原样。但是,对ServiceReference.getService()
的调用将返回null。请注意,使用ServiceReference
时,您应该释放对通过getService()
检索到的实际服务对象的任何引用,这通常需要对服务进行某种跟踪。ServiceTracker
ServiceTracker.remove
。这通常会导致removedService()
或定义的ServiceTracker
上的ServiceTrackerCustomizer
被调用。unbind
方法(如果已指定)。此外,如果使用的服务的基数表明该服务是强制性的,则使用服务也可以是未注册的,甚至可能已停用,或者根据替代服务的可用性和为服务定义的策略激活新实例。