2012-10-25 44 views
-1

特定的捆绑我是新使用OSGi,我有一个关于跟踪捆绑疑问。我使用的是BundleTracker,因为我想要特定的包,并且我想知道我使用的是哪个包。一些Bundle(3)实现相同的接口。我想跟踪那些实现了这个接口的bundle。我怎样才能做到这一点?跟踪OSGi的

+0

我真的很想知道你为什么要这样做。在OSGi中取决于捆绑包而不是包是一种代码异味,所以你应该尽量避免它。你能解释为什么你认为你需要这个吗? –

+0

Im新的OSGi,抱歉,如果我说错了什么,我只想在许多实现相同接口的bundle中选择一个特定的服务。 –

回答

2

如果你想选择一个特定的服务,您可以使用服务属性这一点。这完全不受捆绑包的影响。这意味着你注册了具有特定属性的服务实现(这是BundleContext.registerService中的Dictionary的参数)。

然后,您可以使用BundleContext.getServiceReferences并指定仅选择具有正确属性的服务的过滤表达式(语法描述here)。您可以设置它,以便始终获得最多只有一个元素的数组或集合。

这一切都变得容易得多,如果你使用declarative services,因为那么你可以分别指定在提供和消费组成的服务描述符中的属性和过滤器。您还可以通过configuration admin(将服务组件的配置中的属性作为公开服务的属性或使用的引用传播)对其一端或两端进行配置。我真的建议你在开始任何认真的OSGi工作之前检查一下声明式服务。

需要注意的是,你应该注意不要实现硬编码接线这种方式,因为这会杀了模块化。

+0

我可以使用ServiceTracker过滤实现,然后从这些跟踪的包中选择合适的包? –

+1

是,'ServiceTracker'提供了[构造函数,它接受一个'Filter'](http://www.osgi.org/javadoc/r4v42/org/osgi/util/tracker/ServiceTracker.html#ServiceTracker%28org.osgi。 framework.BundleContext,%20org.osgi.framework.Filter,%20org.osgi.util.tracker.ServiceTrackerCustomizer%29)。 –