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?