我有以下测试代码,它应该注册并取消注册测试服务。我在Eclipse 4.5.2 Mail-Demo appliation中测试了它。问题是服务没有被注销,第二次服务调用不是null。
BundleContext bundleContext = Activator.getDefault().getBundle().getBundleContext();
ServiceRegistration<ITestService> registration = bundleContext.registerService(ITestService.class, new TestService(), null);
ServiceReference<ITestService> serviceReference = bundleContext.getServiceReference(ITestService.class);
bundleContext.ungetService(serviceReference);
serviceReference = bundleContext.getServiceReference(ITestService.class);
System.out.println("should be null but is not: " + serviceReference);
这是我得到的输出:
should be null but is not: {unregister.osgiservice.ITestService}={service.id=172, service.bundleid=8, service.scope=singleton}
如何正确注销服务?
编辑:
好的,我找到了ServiceRegistration.unregister()
,如果我添加下面的代码,则服务是未注册的。这提出了下一个问题,如何从另一个注册服务的地方获取ServiceRegistration
?
registration.unregister();
serviceReference = bundleContext.getServiceReference(ITestService.class);
System.out.println("now the service is null: " + serviceReference);
输出:
should be null but is not: {unregister.osgiservice.ITestService}= service.id=174, service.bundleid=8, service.scope=singleton}
now the service is null: null
答案 0 :(得分:2)
ungetService
只删除特定的服务引用,它不会取消注册该服务。
registerService
会返回ServiceRegistration
,您可以使用该ServiceRegistration<ITestService> reg = bundleContext.registerService(ITestService.class, new TestService(), null);
...
reg.unregister();
取消注册该服务:
start
由您来跟踪服务注册。许多插件将它们存储在插件Activator中。在Activator stop
方法中注册服务并在float color[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
方法中取消注册也很常见。
答案 1 :(得分:0)
尽管上面有greg的答案,我发现这个讨厌的解决方法是使用内部类:
((org.eclipse.osgi.internal.serviceregistry.ServiceReferenceImpl) serviceReference).getRegistration().unregister();
当然这很糟糕,但我需要一个解决方案才能获得ServiceRegistration
。因为我使用Eclipse Gemini Blueprint(以前的Spring DM)来注册我的服务,所以我无法在启动时存储ServiceRegistration
。