我使用ServiceTracker的在我們的OSGi環境位於註冊的服務。 我有在包激活此代碼入手方法:ServiceTracker的不爲了找到一個現有服務
logger.debug("looking for MyService");
tracker = new ServiceTracker(ctx, MyService.class.getName(), null);
tracker.open();
MyService = ((MyService)tracker.getService());
if (MyService != null)
{
logger.debug("found MyService");
}
問題是這樣的:
- 如果我安裝並啓動我的包中 服務可以被發現和使用。
- 如果我完全重新啓動OSGi,我的包(即NULL)即使 我的包處於狀態ACTIVE狀態,MyService也不能爲 。
- 如果我停止/啓動我的包的MyService 可以找到並重新使用。
我不認爲問題在於託管MyService的包,因爲它明顯存在,如果我的包已重新啓動,可以再次找到它。
它看起來像我有依賴服務在它這就是爲什麼它不能在重新啓動後找到它,我重新啓動我的包後,可以找到它的一個前束負載。
的指示,那就是如果我使用
ServiceReference[] ref = tracker.getServiceReferences();
列出可用的服務是OSGi的重新啓動後發現沒有服務,但它確實爲MyService找到我後,啓動/停止我的包,看起來它。
我試圖要求束基準設置爲駐留的MyService希望OSGi框架會識別依賴關係,但它並沒有幫助的捆綁。
任何想法......?
謝謝,這可能解釋了原因。 ServiceTracket建議不要在start方法中使用waitForService()(「強烈建議在調用BundleActivator方法期間不使用waitForService,BundleActivator方法應該在短時間內完成」)。在那種情況下,獲得對該服務的引用的更好方法是什麼?也許在Activator類中保存對bundlecontext的引用,然後從bundle代碼本身調用ServiceTracker.getService()? – Joly 2011-03-20 21:27:20
如果你需要從你的bundle中訪問BundleContext,你應該確實將它從'Activator'保存下來,然後用它來獲得你的服務。我也鼓勵你看一下你使用它的一些系統,比如OSGi規範中的Declarative Services,iPojo或者Apache Felix Dependency Manager。 – 2011-03-20 21:33:27
我嘗試了waitForService,現在這個包掛在了STARTING上,它掛起了整個bootstrap,所以我不認爲waitForService是個好主意...... – Joly 2011-03-20 21:37:59