[英]how to unregister an OSGi service
我有以下测试代码,该代码应注册然后注销一个测试服务。 我在Eclipse 4.5.2 Mail-Demo应用程序中对其进行了测试。 问题在于该服务不是未注册的,对该服务的第二次调用也不为空。
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
ungetService
只会删除特定的服务引用,不会取消注册服务。
registerService
返回一个ServiceRegistration
,您可以用来注销该服务:
ServiceRegistration<ITestService> reg = bundleContext.registerService(ITestService.class, new TestService(), null);
...
reg.unregister();
由您来跟踪服务注册。 许多插件将它们存储在插件激活器中。 通常也可以在Activator start
方法中注册服务,然后在stop
方法中注销。
尽管上面有greg的回答,我还是使用内部类发现了这种讨厌的解决方法:
((org.eclipse.osgi.internal.serviceregistry.ServiceReferenceImpl) serviceReference).getRegistration().unregister();
当然这很糟糕,但是我需要一个解决方案来获取ServiceRegistration
。 由于我使用Eclipse Gemini Blueprint (以前的Spring DM)注册我的服务,因此无法在启动时存储ServiceRegistration
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.