2

我有相当多的服务注册在registerService. 为简单起见,我们假设它们是通过一些属性查找的name。所以一对调用很简单(我使用伪代码作为属性规范):

context.registerService(
    IMyService.getClass().getName(), myServiceInst, {"name"="a"})

之后在客户端:

context.getServiceReferences(IMyService.getClass().getName(), {"name"="a"})

由于某种原因,我无法注册name. 是否可以拦截所有 OSGi 查询,以便在查询时即时创建服务?

我希望有适用于所有 OSGi 层的基本解决方案 - 这意味着上面的代码和带有(例如)声明式服务的代码将以相同的方式工作。

4

2 回答 2

3

看看核心规范中的服务挂钩。它们允许您找出谁在等待什么服务。请注意,如果您对他们正在等待的属性感兴趣,这可能意味着解析过滤器。

于 2013-04-30T13:20:11.423 回答
1

我认为你有几个选择:

选项1:

如果客户端包只需要一个服务对象(客户端包标识键值对),请考虑使用http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/ServiceFactory.html。我认为 javadoc 非常自我解释,您可以在 google 中轻松找到使用示例。在这种情况下,您必须实现 ServiceFactory 并且您必须在声明式服务中使用它(如果我没有使用仅声明式服务的蓝图,请纠正我)

选项 2:

在 ConfigAdmin 的帮助下创建您的服务。您使用客户端捆绑包创建配置,您的服务提供者捆绑包将捕获并导出必要的服务。提供服务后,您可以在客户端捕获新的服务注册。您可以在http://felix.apache.org/site/apache-felix-config-admin.html找到不错的文档。好吧,如果使用此选项,您将能够通过客户端捆绑获得更多服务,但我认为您不能将其与声明式服务一起使用(您必须以编程方式捕获配置更改)。

选项 3:

而不是注册 IMyService 将 IMyServiceFactory 注册为 OSGi 服务。有一个 createService(name) 函数。在这种情况下,在客户端捆绑包中,您必须注意 IMyService 对象的生命周期(如果不再使用 IMyService,您可以“取消”IMyServiceFactory)。

于 2013-04-30T14:07:16.970 回答