Localisation des applications OSGi
Vous pouvez utiliser les classes du package org.apache.aries.blueprint pour étendre le modèle de programmation d'application OSGi ; cette interface SPI tierce est mise à disposition via la fonction de serveur blueprint-1.0. Vous devez accéder aux bundles d'application OSGi afin d'appliquer vos extensions. Dans le profil Liberty, les applications OSGi s'exécutent en tant que sous-systèmes. Pour localiser une application OSGi, vous pouvez créer un objet ServiceTracker dans une fonction utilisateur.
Pourquoi et quand exécuter cette tâche
Cette rubrique explique comment le développeur d'une fonction utilisateur peut localiser des applications OSGi existantes. Cette tâche est souvent requise pour les fonctions utilisateur qui fournissent des extensions de modèle de programmation dans les applications OSGi. Par exemple, une nouvelle fonction utilisateur peut fournir de telles extensions en implémentant un nouvel extenseur de bundle, souvent appelé conteneur, ou plus simplement, en effectuant le suivi des services publiés depuis certaines applications OSGi et en les appelant.
Ce type de fonctions utilisateur doivent utiliser l'élément BundleContext d'une application OSGi exécutée particulière afin de créer de nouvelles instances BundleTracker et ServiceTracker. Ce contexte BundleContext peut être obtenu du service org.osgi.service.subsystem.Subsystem qui est associé à l'application OSGi. La procédure ci-dessous explique comment obtenir ce service de sous-système.
Procédure
Pour localiser une application OSGi en créant un élément ServiceTracker dans une fonction utilisateur, procédez comme suit :
- Construisez un filtre org.osgi.framework.Filter qui cible le sous-système à localiser.
- Créez un élément org.osgi.util.tracker.ServiceTracker qui utilise le filtre de l'étape 1 afin d'obtenir le service org.osgi.service.subsystem.Subsystem associé à l'application OSGi à localiser. Cette instance de service Subsystem fournit tout ce dont vous avez besoin pour utiliser l'application OSGi.
Exemple
import org.osgi.framework.BundleContext;
import org.osgi.service.subsystem.Subsystem;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
String SERVICE_FILTER = "(&(objectClass=org.osgi.service.subsystem.Subsystem)
(subsystem.type=osgi.subsystem.application)(subsystem.symbolicName=my.app))"
org.osgi.framework.Filter filter = ctx.createFilter(SERVICE_FILTER);
org.osgi.util.tracker.ServiceTracker<Subsystem, Subsystem> str = new ServiceTracker<Subsystem, Subsystem>(ctx, filter, null);
org.osgi.framework.Constants.OBJECTCLASS;
org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_SYMBOLICNAME_PROPERTY;
org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_TYPE_APPLICATION;
org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_TYPE_PROPERTY;