OSGi中的服务引用

Jam*_*arr 8 java osgi bundles equinox

一旦从捆绑上下文中检索到OSGi服务的实例,它在服务停止时是否会失效?

我的初步测试表明即使在服务包停止后也可以使用服务实例,这与我对OSGi的动态性质的理解相矛盾.

我想这可以归结为从OSGi容器中的另一个包中检索服务(通过ServiceTracker)实际上是什么,它是创建一个新实例还是它给你一个指向容器中注册的实例的指针?

服务停止后使用服务实例是否有任何危险?

Pav*_*hos 5

这是一个非常好的问题,所以我深入研究了规范,寻找明确的答案.事实证明,整个部分都在讨论这个问题 - 请参阅OSGi服务平台核心规范第4版4.2版第132页开始的第5.4陈旧引用.

根据规范回答您的问题:

未定义的服务的行为是未定义的.此类服务可能会继续正常运作或自行决定是否例外.

并防止潜在的问题:

Bundles必须侦听Framework生成的事件,以清理和删除陈旧的引用.

该规范还提供了一些如何最小化陈旧引用的后果的技巧.