Ich beginne gerade mit OSGi Programmierung und habe zwei Möglichkeiten gefunden, Listener für Dienste zu aktivieren.Wann ich ServiceTracker vs ServiceReference verwenden sollte
Der erste Weg, von einem EclipseRCP Buch verwendet 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]));
}
Die zweite, aus dem Internet Beispielen verwendet 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();
Welche davon ist die richtige und/oder beste Art, ein Verzeichnis aller Dienste zu führen, die eine bestimmte Schnittstelle implementieren? Gibt es einen anderen Weg, dies zu erreichen? Warum scheint es zwei Möglichkeiten zu geben, dasselbe zu tun?