2009-11-17 5 views
11

Je ne fais que commencer avec la programmation OSGi et j'ai trouvé deux façons d'écouter les services activés.Quand utiliser ServiceTracker vs ServiceReference

La première, d'un livre EclipseRCP, utilise 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])); 
} 

La seconde, à partir d'exemples d'Internet, utilise 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(); 

Lequel d'entre eux est correct et/ou la meilleure façon de tenir un registre de tous les services qui implémentent une interface donnée? Y a-t-il une autre façon d'accomplir cela? Pourquoi semble-t-il y avoir deux façons de faire la même chose?

Répondre

15

Comme vous pouvez déjà tirer former le nom du package org.osgi.util.tracker.ServiceTracker est ServiceTracker une classe utilitaire qui (dans certains cas)

simplifie l'utilisation des services du registre des services du Cadre .

En programmation, il y a toujours plusieurs façons de faire. Vous pouvez gérer vous-même vos ServiceReferences ou si cela vous convient ou votre problème, utilisez la classe d'utilitaires groupée qui a ses cas d'utilisation.

Vérifiez également ce Best practices for accessing services

D'autres sources qui indiquent que la plupart du temps, il est sage d'utiliser ServiceTracker

A Comparison of Eclipse Extensions and OSGi Services

OSGi Service Tracker

Getting Started with OSGi: Consuming a Service