如何取消注册OSGi服务

时间:2016-03-23 14:51:11

标签: java eclipse service osgi

我有以下测试代码,它应该注册并取消注册测试服务。我在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

2 个答案:

答案 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

相关问题