2009-11-17 52 views
11

我剛剛開始使用OSGi編程,並且遇到了兩種激活服務的方法。何時使用ServiceTracker vs ServiceReference

第一種方式,從EclipseRCP書,使用服務引用:

String filter="(objectclass="+IModelCreator.class.getName()+")"; 
context.addServiceListener(this, filter); 
modelCreators = Collections.synchronizedMap(
    new HashMap<ModelID, List<IModelCreator>>()); 
ServiceReference references[] = context.getServiceReferences(null, filter); 
if(references==null) return; 
for(int i=0;i<references.length;++i) { 
    this.serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED, 
     references[i])); 
} 

第二,從互聯網上的例子,使用ServiceTracker的:

ServiceTracker logReaderTracker = new ServiceTracker(context, 
       org.osgi.service.log.LogReaderService.class.getName(), null); 
logReaderTracker.open(); 
Object[] readers = logReaderTracker.getServices(); 
if (readers != null) { 
     for (int i = 0; i < readers.length; i++) { 
     LogReaderService lrs = (LogReaderService) readers[i]; 
     m_readers.add(lrs); 
     lrs.addLogListener(m_logger); 
    } 
} 
logReaderTracker.close(); 

其中哪一個是正確的和/或持有實現給定接口的所有服務的註冊的最佳方式?是否有另一種方法來完成這個?爲什麼似乎有兩種方法來做同樣的事情?

回答

15

正如你已經可以得出形成的包名org.osgi.util.tracker.ServiceTrackerServiceTracker一個實用程序類(在某些情況下)

使用服務從 框架的服務註冊簡化。

在編程中總會有幾種做事的方式。你可以自己管理你的服務引用,或者如果它適合你,或者你的問題使用捆綁的實用類,它有它的用例。

還要檢查這個Best practices for accessing services

一些其他來源,其中指出它的大部分時間,它是明智的使用ServiceTracker

A Comparison of Eclipse Extensions and OSGi Services

OSGi Service Tracker

Getting Started with OSGi: Consuming a Service

相關問題