我有一個過濾器的OSGi服務跟蹤器。我注意到有一個它錯過的服務('addingService'沒有被調用)。當我在我的osgi(equinox)shell中使用services命令時,使用跟蹤器使用的過濾器,返回錯過的服務。ServiceTracker有時會錯過服務?
1
A
回答
2
事實證明,在春分,環比ServiceTracker的#addingService經過與參考服務檢查BundleContextImpl#isAssignableTo。這將檢查引用的類是否連線到監聽包中的相同源(jar)。
在我的情況下,試圖獲得服務實現從引用類的來源導致null。原因是該服務實際上是由第三個包中的類創建的(該類稱爲註冊包中的方法,並使用返回值來創建服務)。
增加進口的包裝問題解決了這個問題
1
從Neil BARTLETT的OSGi in practice book (preview)包含一個關於Tracking Services(4.8章節)的有趣章節。
您是否在插件激活器中正確設置了此跟蹤器?
這裏是一本書的例子:
package org.osgi.book.reader.dbmailbox;
import javax.sql.DataSource;
import org.osgi.book.reader.api.Mailbox;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
public class DbMailboxActivator implements BundleActivator{
private BundleContext context;
private ServiceTracker tracker;
public void start(BundleContext context) throws Exception{
this.context=context;
tracker=new ServiceTracker(context,DataSource.class.getName(),new DSCustomizer());
tracker.open();
}
public void stop(BundleContext context) throws Exception{
tracker.close();
}
private class DSCustomizer implements ServiceTrackerCustomizer{
public Object addingService(ServiceReference ref){
DataSource ds = (DataSource)context.getService(ref);
DbMailbox mbox=new DbMailbox(ds);
ServiceRegistration registration = context.registerService(Mailbox.class.getName(),mbox,null);
return registration;
}
public void modifiedService(ServiceReference ref, Object service){
}
public void removedService(ServiceReference ref,Object service){
ServiceRegistration registration = (ServiceRegistration)service;
registration.unregister();
context.ungetService(ref);
}
}
}
相關問題
- 1. ServiceTracker發現的服務
- 2. ServiceTracker的不爲了找到一個現有服務
- 3. 何時使用ServiceTracker vs ServiceReference
- 4. 如何高效地使用ServiceTracker來使用多個服務?
- 5. ServiceTracker vs BundleTracker
- 6. 谷歌播放服務過時錯誤
- 7. 服務器上的ASP.net Web服務有時不會加載
- 8. 什麼時候ServiceTracker取消ServiceReference?
- 9. 有時服務被調用,有時它不會
- 10. 通過web服務錯誤
- 11. 試圖跟蹤部署到apache karaf的包中的服務。 ServiceTracker的#addingService不會被調用
- 12. OSGI ServiceTracker和線程安全
- 13. Windows服務超時過期
- 14. Google Tango服務已過時
- 15. 實時通過Web服務
- 16. Reportins服務超時過期
- 17. ASP.NET 500服務器錯誤有時不通過自定義錯誤頁處理
- 18. 有時Google LVL會因'聯繫許可服務器錯誤'而失敗。有其他人看過這個嗎?
- 19. 通過ajax調用wcf服務的會話錯誤
- 20. 爲什麼我會通過Web API服務選擇Windows服務?
- 21. LoadLibrary在作爲服務啓動時有時會失敗
- 22. 當安裝angular2時,服務器有時會返回500
- 23. Web服務超時錯誤
- 24. 啓動服務時出錯
- 25. 錯誤時後到服務
- 26. 會員/授權通過REST服務
- 27. ASMX Web服務通過會話
- 28. 通過facebook會話服務(SDK 3.0.1)
- 29. 的WebService不會通過服務引用
- 30. 通過服務器的Rails會話
註冊另一個bundle創建並沒有真正似乎是合理的事情不要做,對象作爲服務,不是嗎?我的意思是,這將嚴重干擾OSGi對捆綁服務的主動服務等概念。恕我直言,你應該在嘗試註冊「錯誤」對象時收到異常。 –