我使用ServiceTracker的在我们的OSGi环境位于注册的服务。 我有在包激活此代码入手方法:ServiceTracker的不为了找到一个现有服务
logger.debug("looking for MyService");
tracker = new ServiceTracker(ctx, MyService.class.getName(), null);
tracker.open();
MyService = ((MyService)tracker.getService());
if (MyService != null)
{
logger.debug("found MyService");
}
问题是这样的:
- 如果我安装并启动我的包中 服务可以被发现和使用。
- 如果我完全重新启动OSGi,我的包(即NULL)即使 我的包处于状态ACTIVE状态,MyService也不能为 。
- 如果我停止/启动我的包的MyService 可以找到并重新使用。
我不认为问题在于托管MyService的包,因为它明显存在,如果我的包已重新启动,可以再次找到它。
它看起来像我有依赖服务在它这就是为什么它不能在重新启动后找到它,我重新启动我的包后,可以找到它的一个前束负载。
的指示,那就是如果我使用
ServiceReference[] ref = tracker.getServiceReferences();
列出可用的服务是OSGi的重新启动后发现没有服务,但它确实为MyService找到我后,启动/停止我的包,看起来它。
我试图要求束基准设置为驻留的MyService希望OSGi框架会识别依赖关系,但它并没有帮助的捆绑。
任何想法......?
谢谢,这可能解释了原因。 ServiceTracket建议不要在start方法中使用waitForService()(“强烈建议在调用BundleActivator方法期间不使用waitForService,BundleActivator方法应该在短时间内完成”)。在那种情况下,获得对该服务的引用的更好方法是什么?也许在Activator类中保存对bundlecontext的引用,然后从bundle代码本身调用ServiceTracker.getService()? – Joly 2011-03-20 21:27:20
如果你需要从你的bundle中访问BundleContext,你应该确实将它从'Activator'保存下来,然后用它来获得你的服务。我也鼓励你看一下你使用它的一些系统,比如OSGi规范中的Declarative Services,iPojo或者Apache Felix Dependency Manager。 – 2011-03-20 21:33:27
我尝试了waitForService,现在这个包挂在了STARTING上,它挂起了整个bootstrap,所以我不认为waitForService是个好主意...... – Joly 2011-03-20 21:37:59