【问题标题】:Service.FindHook event was'nt called by adding service reference to a component通过向组件添加服务引用未调用 Service.FindHook 事件
【发布时间】:2012-08-02 11:36:22
【问题描述】:

今天我使用了一些 OSGi Hooks,特别是 FindHookEventListenerHook 用于服务。我想尝试代理服务。 EventListenerHook 工作正常,我的服务已被代理。但我意识到,如果服务将通过使用@Reference(Bnd 样式)注释相关的setXXX 方法来获得服务实现的引用,则不会调用FindHook 事件。也许这不是注释的问题,而是一般的DS。

这很糟糕,因为注册了两个服务,一个没有代理,一个被代理。我只想从代理那里获得参考。一般来说,在没有 DS 的情况下,您可以通过调用 BundleContext.getServiceReference(java.lang.Class<S> clazz) 来获取引用,并且将调用事件 FindHook.find,您可以在其中决定要返回哪个 ServiceReference

当我使用类似 DS 的方法(对我来说:Bnd 注释 @Reference)时,会执行什么样的流程?正如我在上一节中所描述的:我想决定应该引用哪些服务。

【问题讨论】:

    标签: java osgi declarative-services bnd


    【解决方案1】:

    这确实是您的 DS 实施的问题。这取决于 DS impl 如何代表组件包管理服务访问,因为定位服务的是 DS 实现包。如果 DS 实现使用组件包的 BundleContext 来查找服务,那么您应该能够影响组件包可见的服务。

    【讨论】:

    • 好的。你的意思是它有事做我用什么样的框架?例如,我使用的是 Apache Felix。
    • 不是 OSGi 框架,而是声明式服务的实现(您也可能从 Apache Felix 项目中获得)。
    【解决方案2】:

    当框架必须在两个都满足请求的服务之间做出决定时,它首先选择具有更高服务等级的服务。该排名可以在注册服务时设置为属性。因此,在注册代理时,请确保其服务排名高于竞争服务。

    【讨论】:

      【解决方案3】:

      感谢您的回答,但我自己找到了解决方案。经过几个小时的调试,我发现我的代码的 if 条件被违反了,并且没有发生任何特别的事情。

      【讨论】:

        猜你喜欢
        • 2019-01-14
        • 1970-01-01
        • 2011-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-07
        • 2021-07-23
        相关资源
        最近更新 更多