2009-11-17 12 views
11

Estoy empezando con la programación de OSGi y me he encontrado con dos maneras de escuchar los servicios que se activan.Cuándo utilizar ServiceTracker vs ServiceReference

La primera forma, de un libro EclipseRCP, utiliza ServiceReference:

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])); 
} 

El segundo, a partir de ejemplos de Internet, utiliza 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(); 

¿Cuál de ellas es la correcta y/o ¿La mejor manera de mantener un registro de todos los servicios que implementan una interfaz determinada? ¿Hay alguna otra manera de lograr esto? ¿Por qué parece haber dos formas de hacer lo mismo?

Respuesta

15

Como ya se puede derivar formar el nombre del paquete es org.osgi.util.tracker.ServiceTrackerServiceTracker una clase de utilidad que (en algunos casos)

simplifica el uso de los servicios de registro de servicios del marco .

En la programación siempre hay varias formas de hacer las cosas. Puede gestionar sus ServiceReferences por su cuenta o, si le conviene a usted o a su problema, utilizar la clase de utilidad incluida que tiene sus casos de uso.

Consulte igualmente la Best practices for accessing services

Algunas otras fuentes, que establecen que la mayor parte del tiempo, es aconsejable utilizar ServiceTracker

A Comparison of Eclipse Extensions and OSGi Services

OSGi Service Tracker

Getting Started with OSGi: Consuming a Service

Cuestiones relacionadas