Utilisation des services OSGi
Les services peuvent être enregistrés et désenregistrés de façon asynchrone à tout moment. Par conséquent, appelez chaque service le moins longtemps possible. Vous pouvez utiliser la classe ServiceTracker pour effectuer le suivi de la disponibilité des services simultanément.
Pourquoi et quand exécuter cette tâche
Si vous voulez effectuer le suivi de services, vous pouvez créer un objet ServiceTracker en utilisant votre contexte de bundle, l'interface de votre choix, et les propriétés à mettre en correspondance, puis ouvrir la fonction de suivi. Vous pouvez demander à ce dernier d'indiquer la meilleure correspondance ou toutes les correspondances. Assurez-vous de ne pas occuper le service après l'avoir utilisé. Il n'est pas nécessaire d'indiquer à la fonction de suivi que vous avez terminé ; ce dernier place les services correspondants en cache de façon interne et les efface une fois qu'ils sont désenregistrés. Une fois que vous avez terminé d'utiliser la fonction de suivi, servez-vous de la méthode serviceTracker.close() pour le fermer.
Exemple
L'exemple suivant utilise un objet ServiceTracker pour effectuer le suivi d'un service :
package com.ibm.foo.tracker;
import com.ibm.foo.simple.Foo;
import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;
/**
* Simplest use of a ServiceTracker to get a service
*/
public class TrackingFooUser
{
private ServiceTracker<Foo,Foo> serviceTracker;
public TrackingFooUser( BundleContext bundleContext )
{
serviceTracker = new ServiceTracker<Foo, Foo>( bundleContext, Foo.class, null );
serviceTracker.open();
}
public void doFoo() {
Foo foo = serviceTracker.getService();
//use foo
//no need to return it... just don't use it for long.
}
public void shutdown() {
serviceTracker.close();
}
}