M2TI : Conception d'Applications Hétérogènes Distribuées

TP OSGi

Objectifs pédagogiques

Expérimenter une architecture à base de composants téléchargeables dynamiquement.

Outils

Dans ce TP, vous aurez besoin de télécharger le framework OSGi Felix (lien "downloads" dans le menu de gauche, puis rubrique "Framework distribution"), ainsi que des sources disponibles sur la forge. Les fichiers JAR déjà packagés des bundles sont disponibles dans les fichiers de ce projet. Vous déploierez vos modules à la main.

Découverte du framework Felix

Téléchargez et décompressez le framework Felix sur un répertoire local de votre machine. Lancez-le comme indiqué ici, et tapez "lb" (list bundles) pour avoir la liste des bundles installés par défaut.

Chargement et exécution d'un bundle

Téléchargez sur la forge le bundle helloworld.jar (dont le code est situé ici), installez-le, lancez-le et stoppez-le comme indiqué . Normalement, vous devez voir s'exécuter les méthodes de gestion du cycle de vie start() et stop(), d'implémentation de l'interface BundleActivator.

Réalisation d'un bundle

Vous allez maintenant réaliser vous-même un bundle OSGi, en suivant les tutoriels Felix numéros 2 et 3. Une fois les fichiers recopiés et les jars faits, suivez la même procédure que précédemment pour les déployer et les démarrer. Vous avez réalisé deux bundles, dont l'un est client de l'autre.

Remarques :

Utilisation de Maven avec OSGi

"Mavenisez" vos projets précédents. Pour cela :

Utilisation de Felix OSGi dans GlassFish 4.1

Vous allez maintenant utiliser le serveur d'applications GlassFish pour faire tourner vos bundles. Ce serveur est bâti autour du framework OSGi Felix, qui implémente la Release OSGi 4.2.

La première chose à faire est de télécharger, dézipper et démarrer le serveur, comme indiqué ici : https://glassfish.java.net/download.html. Vous trouverez la documentation complète sur l'administration de GlassFish ici https://glassfish.java.net/docs/4.0/administration-guide.pdf et sur l'utilisation d'OSGi dans GlassFish là : https://glassfish.java.net/public/GF-OSGi-Features.pdf.

Lancez le serveur comme indiqué. Ensuite, ouvrez un shell et lancez la commande asadmin ; le prompt doit indiquer "asadmin". Pour taper vos commandes Felix dans cette console, vous pouvez :

  1. taper les mêmes commandes que dans le shell Felix, en les précédant de "osgi". Exemple : osgi lb,
  2. lancer un remote shell Felix (Gogo), à l'aide de la commande osgi-shell ; tapez ensuite vos commandes comme dans la question précédente.

Suivez les indications de la doc d'administration pour installer la console Web OSGi et vérifiez son fonctionnement. Attention : la doc n'est pas à jour. Vous devez installer le composant nommé glassfish-osgi-gui. Cela peut prendre du temps...
Redémarrez le serveur (!). Vous devez voir un onglet "OSGi Console" dans le menu "server (Admin Server)". Contrairement à ce qui est marqué dans la doc, vous pouvez vous y connecter avec l'utilisateur "admin", mais sans mot de passe.

Déploiement d'un bundle

Vous allez maintenant déployer les bundles que vous avez réalisés. Pour cela il faut d'abord modifier les fichiers manifest.mf car ceux des tutoriels de Felix n'utilisent pas la même version du langage de définition des manifest. Vous devez :

Cela fait, installez et démarrez vos bundles. Normalement, vous devriez les voir apparaître dans la liste des bundles déployés. Dans tous les cas, vous avez dû voir le rapport de déploiement dans la console.

Allez ensuite dans la console d'administration de GlassFish, cliquez sur le "Bundle-SymbolicName" de votre composant et cliquez sur "Install/Update...". Attribuez-lui un startLevel de 3 et validez. Normalement, vous devriez le voir apparaître comme "Active". Vous pouvez donc désormais appeler les méthodes de gestion du cycle de vie et de service de ce composant de la même manière que s'il était dans un autre type de conteneur.

Reprise de l'application répertoire

Première approximation

De la même manière que dans les TP précédents, vous allez reprendre votre application de répertoire après la partie "uniformisation" du TP1. Créez trois bundles contenant :

Packagez sous forme de Web Application Bundle (WAB) - Aide : http://coding.alasdair.info/2011/01/creating-web-application-bundle-using.html et http://www.javabeat.net/writing-an-osgi-web-application/ - et déployez dans GlassFish. Testez.

À ce stade, vous êtes prêts pour le séance OSGi bis. Vous pouvez toutefois aller jusqu'à la question suivante sans impacter le déroulement de cette séance OSGi bis.

Implémentations multiples

Vous allez maintenant "sortir" les répertoires du serveur et les placer dans des bundles séparés. Vous n'avez donc plus besoin d'un conteneur dans le serveur. Créez les bundles suivants :

Pour l'instant, ne vous préoccupez pas de la persistance, elle sera gérée à la séance suivante.

Indication : issue de la page d'accueil d'OSGi, à propos du fait que vos répertoires implémentent la même interface.

What happens when multiple bundles register objects under the same interface or class? How can these be distinguished? The answer is properties. Each service registration has a set of standard and custom properties. A expressive filter language is available to select only the services in which you are interested. Properties can be used to find the proper service or can play other roles at the application level.

Gestion des versions

Réalisez un autre composant qui implémente l'interface du répertoire, et qui renvoie une réponse de type "service non disponible". Donnez à ce composant un numéro de version inférieur à celui des répertoires "fonctionnels". Modifiez le fonctionnement de votre serveur pour qu'il cherche le répertoire correspondant à une commande donnée et qu'il switche sur cette implémentation par défaut quand il ne trouve pas cette commande dans les répertoires disponibles (par exemple, avec un OR dans le filtre que la propriété indiquant la commande).

Simulez une panne en déployant et supprimant un service fonctionnel, sans arrêter le framework, et interrogez-le entre temps avec le client. Vérifiez que le framework vous renvoie bien la dernière version du service demandé.

Chargement / déchargement à chaud

Modifiez l'interface Web pour qu'elle permette d'envoyer au serveur toutes sortes de commandes et de paramètres correspondant à son interface. En clair, rajoutez un champ texte qui permettra de taper une commande.
Côté serveur, récupérez cette commande et passez-la en paramètre de l'appel de service. Suite au mécanisme de fallback de la question précédente, vous devez obtenir le message d'erreur générique.

Déployez un service fonctionnel correspondant à cette commande, sans arrêter le framework. Ré-interrogez-le avec le client et vérifiez son fonctionnement.
Vous devez maintenant pouvoir déployer n'importe quel composant et l'interroger avec votre client Web.

Licence Creative Commons
Valid XHTML 1.0 Strict