当从bundle context检索到OSGi服务的实例时,如果服务停止,它是否会失效?
我的初步测试表明,即使服务bundle停止,服务实例仍然可以使用,这与我对OSGi动态特性的理解相矛盾。
我想这归结于从OSGi容器中的另一个bundle(通过ServiceTracker)检索服务实际上是做了什么,它是创建一个新实例还是给你一个指向在容器中注册的实例的指针?
在服务停止后继续使用服务实例是否存在任何危险?
OSGi规范说明:
Bundle是在正常应用程序编程中可见的实体。例如,当一个Bundle被停止时,它的所有服务都将被注销。
因此,您不应该能够从已停止的Bundle中获取服务。但从技术上讲,可能可以使用它,至少只要您持有对服务对象的引用(没有人可以从您那里拿走它,并且它不会被GC'd)。但我认为使用该服务并不安全。它可能取决于其他Bundle资源,在Bundle停止后不可用。
容器不会创建服务的新实例,除非涉及到ServiceFactory(请参见规范)。查找服务应始终为您提供指向容器中已注册实例的指针。
在服务停止后使用服务实例是否存在任何危险?
这完全取决于服务实现方式;但是,在一个Bundle中这样做会自动创建一个与规范不符合的Bundle。
在实践中,许多服务都被实现为释放资源和引用,并且不再正确响应。
一个服务引用不应该被保留为引用。您应该始终在运行时查找服务。然而,这将使您与OSGI api联系在一起,而这并不总是想要的。
请看一下以下内容: - OSGI serviceTracker - OSGI declarative services - OSGI BluePrint - Spring DM - Peaberry - iPojo
它们都会为您处理动态性,其中大多数没有使用OSGI api。
此致敬礼,
Leen Toelen