osgi - 在声明式服务中。当服务被停用时,对它的引用何时被删除?

标签 osgi declarative-services

如果我有一个被其他组件(称为 B)引用的服务 A,此时 B 对 A 的引用将变为空?

-在调用A的deactivate方法之前?

-调用A的deactivate方法后,完成了吗?

-对象实例销毁后?

我浏览了纲要规范,但找不到相关详细信息。如果有人能为我澄清一下,我将不胜感激。

此外,当服务 A 被激活时,它何时作为对 B 的引用被注入(inject)?在激活方法之前还是之后?

最佳答案

这个问题有两个答案,这取决于您使用的是静态策略还是动态策略作为引用。我将首先介绍静态策略。

在激活期间,静态策略保证将要调用的所有绑定(bind)方法在激活方法之前被调用。请注意,如果任何引用是可选的,则绑定(bind)可能根本不会被激活。但是 DS 强制执行happens-before 关系(在 Java 内存模型 JSR133 的术语中),以便 activate 方法可以安全地依赖在静态策略引用的绑定(bind)方法期间设置的任何字段的值,没有显式同步。

使用静态策略,如果任何绑定(bind)的服务变得不可用,则必须停用该组件。 DS 再次保证在调用任何解除绑定(bind)方法之前调用并完成 deactivate 方法。 (请注意,很少需要为静态引用实现解除绑定(bind)方法……如果您的组件需要进行任何清理,那么在 deactivate 方法中完成所有操作会更容易)。

现在,动态策略让事情变得更加复杂。对于动态+强制引用,仍然可以保证在 activate 方法开始之前已经调用了 bind 方法,但是之后所有的赌注都关闭了。实际上有可能调用绑定(bind)/取消绑定(bind)(甚至多次!) activate 方法的执行期间。

另外请务必引用第 112.5.10 节(“绑定(bind)服务替换”),其中描述了绑定(bind)/解除绑定(bind)的调用顺序。一开始它可能不直观——新服务的绑定(bind)在旧服务的解除绑定(bind)之前被调用——但是当你考虑它时就很有意义了,因为它保证强制引用永远不会绑定(bind)到空。

关于osgi - 在声明式服务中。当服务被停用时,对它的引用何时被删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30030752/

相关文章:

java - 如何使用附加包扩展 BndTool 存储库?

ant - 将 PaxExam 与 Bndtools 结合使用

java - 在 Apache Karaf 的日志文件中打印 System.out.println

java - 在 pax 考试测试阶段未创建配置管理和声明性服务

Osgi 声明式服务条件绑定(bind)

java - 最好使用类型或属性在 OSGi 声明式服务之间进行选择吗?

java - Eclipse Virgo 与 Apache Servicemix 对比

java - 控制osgi声明性服务的实例化

java - 引用配置管理工厂创建的 OSGi 服务

java - 使用 gradle 生成 OSGI-INF/serviceComponent.xml