OSGi:当服务仍在运行时停止导入的服务会发生什么

时间:2013-12-04 07:52:04

标签: service osgi declarative-services

说我正在使用在另一个service A中导入的service B。虽然B正常运行(当然A处于活动状态),但service Aservice B仍在运行时会发生Service A -> Service B会发生什么? 的 ServiceReference

如果我使用ServiceTrackerDS& {{1}}?

2 个答案:

答案 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被调用。
  • 对于DS,将调用所引用服务的已定义unbind方法(如果已指定)。此外,如果使用的服务的基数表明该服务是强制性的,则使用服务也可以是未注册的,甚至可能已停用,或者根据替代服务的可用性和为服务定义的策略激活新实例。