我在registerService
注册了大量服务。为简单起见,我们假设它们是由某个属性name
查找的。所以这对调用很简单(我使用伪代码作为属性规范):
context.registerService(
IMyService.getClass().getName(), myServiceInst, {"name"="a"})
之后在客户端:
context.getServiceReferences(IMyService.getClass().getName(), {"name"="a"})
出于某种原因,我无法注册name
的所有可能组合。是否有可能拦截所有OSGi查询,以便我们可以在查询时动态创建服务?
我希望有一个适用于OSGi所有层的基本解决方案 - 它意味着上面的代码和(例如)声明式服务的代码将以相同的方式工作。
答案 0 :(得分:3)
查看核心规范中的Service Hooks。它们允许您找出谁在等待什么服务。请注意,如果您对他们正在等待的属性感兴趣,这可能意味着要解析过滤器。
答案 1 :(得分:1)
我认为你有几个选择:
选项1:
如果客户端捆绑包只需要一个Service对象(客户端捆绑包标识键值对),请考虑使用http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/ServiceFactory.html。我认为javadoc非常自我解释,您可以在谷歌中轻松找到使用样本。在这种情况下,您必须实现ServiceFactory,并且您必须在Declarative Services中使用它(如果我没有使用声明性服务,请更正我的蓝图)
选项2:
在ConfigAdmin的帮助下创建您的服务。您使用客户端捆绑包创建配置,服务提供商捆绑包将捕获该配置并导出必要的服务。提供服务后,您可以访问客户端的新服务注册。你可以在http://felix.apache.org/site/apache-felix-config-admin.html找到好的文档。那么在这个选项的情况下,您将能够通过客户端捆绑包获得更多服务,但我认为您不能将它与Declarative Services一起使用(您必须以编程方式捕获配置更改)。
选项3:
而不是将IMyService注册IMyServiceFactory注册为OSGi服务。具有createService(name)函数。在这种情况下,在客户端捆绑包中,您必须处理IMyService对象的生命周期(如果不再使用IMyService,则可以“取消”IMyServiceFactory)。