【问题标题】:Referencing a Configuration Admin factory-created OSGi service引用配置管理员工厂创建的 OSGi 服务
【发布时间】:2019-01-06 17:31:51
【问题描述】:

我阅读了 Neil Bartlett 的 this answer,其中指出 DS 能够替换旧的 ManagedServiceFactory 实例化服务方法:

通过添加“configurationPolicy: require”,组件可以用作单例(即 MS)或工厂(即 MSF)。如果您使用与 component.name 相同的 Factory PID 创建一个工厂配置,那么您将获得一个工厂。

据我所知,使用工厂 PID 创建新配置会使配置管理员创建此服务的新实例;确实,这就是发生的事情。

假设我的工厂 PID 为 test,然后我为 test-1 添加了一个配置为 felix-fileinstall。然后,当我添加相应的配置时,此服务会正确实例化并激活。

如果我这样做

@Reference(target="(service.pid=test-1)")
Test test;

这显然永远不会得到解决,因为创建的配置is required to have a generated GUID

如何获得对该服务的引用?我需要为每个配置实例添加一个额外的属性来过滤吗?

【问题讨论】:

  • 不确定是否可以使该参考工作,但如果您必须在代码中编写 PID,这可能不是一个好兆头。我会在服务配置上创建另一个属性并按此过滤。
  • 谁说出我的名字,把我从沉睡中唤醒?

标签: java osgi declarative-services


【解决方案1】:

为什么需要获得对这个特定服务实例的引用?

一般来说,服务消费者应该避免对服务背后的实现了解太多,当然导致组件被实例化的 PID 应该被视为实现的内部细节。

获取服务时,您主要关心服务的功能——这就是服务接口。那么您可能还关心服务的补充属性。

例如,如果我的管道爆裂,那么我需要一名管道工,因此我寻找Plumber 类型的服务。如果现在是凌晨 2 点并且我住在伦敦,那么我需要一个 24 小时的管道工,所以我添加了一个过滤器:(&(available=24hr)(location=London))。我可能还会使用(yelp_rating>=4.0) 来优化过滤器。但我不会在意水管工的名字或他晚餐吃了什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 2018-09-09
    • 1970-01-01
    相关资源
    最近更新 更多