java - 如何取消注册 OSGi 服务

标签 java eclipse service osgi

我有以下测试代码,它应该注册并取消注册测试服务。我在 Eclipse 4.5.2 Mail-Demo 应用程序中测试了它。问题是服务没有注销,第二次调用服务不为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

最佳答案

ungetService 只是删除特定的服务引用,它不会取消注册服务。

registerService 返回一个 ServiceRegistration,您可以使用它来取消注册服务:

ServiceRegistration<ITestService> reg = bundleContext.registerService(ITestService.class, new TestService(), null);

...

reg.unregister();

由您来跟踪服务注册。许多插件将它们存储在插件激活器中。在 Activator start 方法中注册服务并在 stop 方法中取消注册也很常见。

关于java - 如何取消注册 OSGi 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36181447/

相关文章:

java - null 在此代码中如何工作?

java - Eclipse 不显示不存在的 Maven 属性

java - 如果我有 2 个 Maven 项目,而其中一个项目需要另一个作为库,我该如何避免 Eclipse 中出现冗余 "maven-update"

java - Android 应用程序中的菜单操作和总和

java - 即使应用程序被强制停止,也要重新启动服务,即使在关闭应用程序后仍然在后台运行服务如何?

android - 绑定(bind)服务调用给出 NullPointerException

java - 为什么这不会导致 NullPointerException?

java - 如何将 JLabel 对齐到 JPanel 的底部

java - 插入触发器导致 EntityNotFoundException

performance - 解决可扩展性