簡體   English   中英

如何注銷OSGi服務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM