【问题标题】:OSGi DS: Omit unbind method with Felix SCR @Reference annotationOSGi DS:使用 Felix SCR @Reference 注释省略取消绑定方法
【发布时间】:2011-10-15 06:57:07
【问题描述】:

OSGi 声明式服务被明确允许有一个绑定方法,而没有匹配的取消绑定方法作为引用,因为“一旦组件配置被停用,SCR 必须丢弃对组件实例和与激活关联的组件上下文的所有引用。”

我正在使用 Apache Felix maven-scr-plugin 从 Java5 注释生成我的服务组件 XML。如果我从 @Reference 注释中省略了“unbind”属性,那么我会得到这个失败:

[ERROR] @Reference: Missing method unbind for reference configuration at Java annotations in <classname>:<linenum>

为什么 SCR 生成器这么严格?有没有办法告诉它容忍省略的 unbind 方法?也许我需要向 Felix 提交缺陷?

当然,在我的服务中添加简单的取消绑定方法很容易,但规范说它们是不需要的。

【问题讨论】:

    标签: osgi declarative-services


    【解决方案1】:

    如果您使用规范中的标准 DS 注释,bnd 将生成 XML,您甚至不需要单独的 Maven 插件。

    顺便说一句,如果引用策略是动态的,您应该始终有一个 unbind 方法——即使基数是强制性的,因为您可能必须处理动态重新绑定。在这种情况下,bnd 将引发警告,而不是错误。

    当引用策略是静态的时,完全不需要取消绑定方法。在这种情况下,组件实例必须被销毁,因此您可以在 deactivate 方法中进行清理。

    【讨论】:

      【解决方案2】:

      您引用的文本(112.5.13 纲要 v4.2)与取消绑定没有直接关系,它指的是停用,这反过来又需要取消绑定。稍后在规范 (112.5.15) 中声明“对于使用事件策略的每个引用,必须为该引用的每个绑定服务调用 unbind 方法。”

      EDIT 忽略上面,见下面的 cmets。在当前版本的 Felix SCR 中,“generateAccessors”默认启用,您绝对不需要编写绑定/取消绑定方法。 2011 年 7 月的 IIRC 并非如此。

      【讨论】:

      • 有趣,所以“必须调用”说实际上需要取消绑定方法?我的理解是服务实例无论如何都会被丢弃,所以如果引用不为空也没什么大不了的。但这似乎是不正确的。
      • 由于服务实例没有被代理,唯一丢弃它的方法就是将其清空。在卸载捆绑包的情况下,捆绑包的类加载器加载的所有类实例都必须无效,以确保整个捆绑包(类加载器、所有类和实例)都被垃圾回收。
      • @Chris,只是在修改插件-有一个配置选项“generateAccessors”-我还没有尝试过,但猜测如果您将其设置为 true,它将生成 un/bind 方法你。
      • DS 规范不需要取消绑定方法。我怀疑处理注释的工具太严格了。
      【解决方案3】:

      Bnd 也可以从注解生成 DS XML,并且没有这个限制。

      【讨论】:

        猜你喜欢
        • 2017-07-29
        • 1970-01-01
        • 1970-01-01
        • 2018-04-27
        • 1970-01-01
        • 2015-08-07
        • 1970-01-01
        • 2016-10-23
        • 2019-06-17
        相关资源
        最近更新 更多