La plateforme dynamique à services OSGi



Documents pareils
S T L - C P S - L e s p l u g i n s E c l i p s e. - Une Introduction , Frédéric Peschanski

Java Naming and Directory Interface

I-JVM: une machine virtuelle Java pour l isolation de composants dans OSGi

Remote Method Invocation Les classes implémentant Serializable

TP1 : Initiation à Java et Eclipse

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Remote Method Invocation (RMI)

Threads. Threads. USTL routier 1

Synchro et Threads Java TM

JOnAS Day 5.1. Outils de développements

Serveur d'application à la juste taille

Bases Java - Eclipse / Netbeans

Dis papa, c est quoi un bus logiciel réparti?

La plate-forme dynamique de service OSGi

Un ordonnanceur stupide

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Cours Plugin Eclipse. Université Paris VI / Parcours STL / Master I Pierre-Arnaud Marcelot - Iktek - pamarcelot@iktek.com

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

JOnAS 5. Serveur d application d

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

INITIATION AU LANGAGE JAVA

Module d anonymisation

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Messagerie asynchrone et Services Web

Introduction au Déploiement

CAHIER DES CHARGES D IMPLANTATION

Calcul Parallèle. Cours 5 - JAVA RMI

Programmer en JAVA. par Tama

Java RMI. Arnaud Labourel Courriel: Université de Provence. 8 mars 2011

RMI le langage Java XII-1 JMF

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

TP1 : Initiation à Java et Eclipse

NFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007

Remote Method Invocation en Java (RMI)

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Auto-évaluation Programmation en Java

La base de données XML exist. A. Belaïd

Eclipse atelier Java


Java Licence professionnelle CISII,

24/11/2011. Cours EJB/J2EE Copyright Michel Buffa. Plan du cours. EJB : les fondamentaux. Enterprise Java Bean. Enterprise Java Bean.

Programmation Par Objets

Exposé Systèmes Réseaux

Utilisation de Jakarta Tomcat

TP1. Outils Java Eléments de correction

Java pour le Web. Cours Java - F. Michel

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

IBM SPSS Collaboration and Deployment Services Deployment Manager 5 - Instructions d installation

Composants Logiciels. Le modèle de composant de CORBA. Plan

SugarCubes. Jean-Ferdinand Susini Maître de Conférences, CNAM Chaire systèmes enfouis et embarqués. Paris, le 9 janvier, 2009

Notion de thread (1/2)

COMMUNICATION TECHNIQUE N TCV060 Ed. 01. OmniVista 4760 Nb de pages : 18 Date : URGENTE NON URGENTE TEMPORAIRE DEFINITIVE

Premiers Pas en Programmation Objet : les Classes et les Objets

as Architecture des Systèmes d Information

TD/TP 1 Introduction au SDK d Android

Meta Object Facility. Plan

Une introduction à la technologie EJB (2/3)

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Gestion d identités PSL Exploitation IdP Authentic

Corrigé des exercices sur les références

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Automatisation de l administration système

Java DataBaseConnectivity

1 Repérer les paramètres d installation (.exe ou.msi).

Sun Java System Access Manager Notes de version pour Microsoft Windows

contact@nqicorp.com - Web :

Définition des Webservices Ordre de paiement par . Version 1.0

Java c est quoi? Java. Java. Java : Principe de fonctionnement 31/01/ Vue générale 2 - Mon premier programme 3 - Types de Programme Java

FileMaker Server 14. Guide de démarrage

Plateforme PAYZEN. Définition de Web-services

Introduction : les processus. Introduction : les threads. Plan

Architectures web/bases de données

contact@nqicorp.com - Web :

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

IDEC. Windows Server. Installation, configuration, gestion et dépannage

Projet gestion d'objets dupliqués

Projet de programmation (IK3) : TP n 1 Correction

Utiliser Java sans BlueJ

Système Principal (hôte) 2008 Enterprise x64

Initiation à JAVA et à la programmation objet.

Open Source Job Scheduler. Installation(s)

JOnAS 5 Enterprise OSGi javaee compliant

Outils, langage et approche Android Une introduction. Nicolas Stouls lyon.fr

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Network Shutdown Module V3 Extension du Manuel Utilisateur pour architecture Virtualisée VMWare ESX Server

Java - RMI Remote Method Invocation. Java - RMI

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Annexe 10 - Procédure pour créer un Jar

Web Tier : déploiement de servlets

Programmation Orientée Objet - Licence TIS CM8/9. Rappel sur la séance précédente. Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers.

Systeme d'exploitation

Quick Start Installation de MDweb version 2.3

Intergiciel - concepts de base

Applet pour visualiser les variables «automate» notifiées

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Bind, le serveur de noms sous Linux

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Transcription:

La plateforme dynamique à services OSGi Gaël Thomas gael.thomas@lip6.fr Université Pierre et Marie Curie Master Informatique M2 Spécialité SAR Service : entité informatique définie par un contrats Contrat : ensemble de propriétés définissant l accès à l entité Exemple :!! Une interface Java ou IDL (interface offerte ou interface requise)!! Le nombre de dpi pour une imprimante Relation contractuelle : constitué de!! Contrats des services (des fournisseurs et des clients)!! Propriétés contractuelle Exemple :!! Deux interfaces égales (interface serveur = interface du client)!! Pas de perte de message et 14 requêtes par seconde 21/09/10 Principe des Systèmes Informatiques Avancé 2 Résolution de contrat : construction de la relation contractuelle!! Mise en adéquation des contrats!! Définition des propriétés contractuelles Annuaire : associe des contrats avec des services! Reconnaissance d un service en fonction de ce qu il sait faire i.e : pas de dépendance vis à vis d un nom indépendant! Mécanisme de recherche intuitif "Cherche une imprimante couleur à l étage" Trois intervenants Fournisseur de service (serveur) Imprimante, amazone.com Utilisateur de service (client) Utilisateur final, application à base de services, moteur d orchestration Un annuaire de services (Service Registry) UDDI, pages jaunes, registry OSGi Interface d imprimante { void print(postscript file) Propriétés :! couleur = vrai! étage = mon-étage Remarque : un service peut, bien sûr, être à la fois fournisseur et client 21/09/10 Principe des Systèmes Informatiques Avancé 3 21/09/10 Principe des Systèmes Informatiques Avancé 4

Plateforme à service statique : Résolution des contrats à la conception!! Impossible de sélectionner le fournisseur à l exécution +! Facile à programmer, client reste indépendant de l implémentation Architecture orientée service dynamique Exemples : Web Services, OSGi, Jini Plateforme à service dynamique Résolution des contrats au chargement!! Impossible de changer de fournisseur en cours d exécution +! Facile à programmer 2 - recherche 3 sélection Imprimante N/B 1 - enregistrement Plateforme à service dynamique et adaptable Résolution des contrats au chargement +! Modification des contrats en fonction des départs et arrivées dynamique des services!! Difficile à programmer 4 connexion purinta.lip6.fr 21/09/10 Principe des Systèmes Informatiques Avancé 5 21/09/10 Principe des Systèmes Informatiques Avancé 6 Architecture orientée service dynamiquement adaptable Adaptation du client au contexte Exemples : OSGi Architecture orientée service dynamiquement adaptable Adaptation du client au contexte Exemples : OSGi 6 - notification Imprimante N/B 5 - enregistrement 7 - recherche Imprimante N/B Imprimante Coul. 8 sélection Imprimante Coul. purinta.lip6.fr ayaku.lip6.fr 9 reconnexion purinta.lip6.fr ayaku.lip6.fr 21/09/10 Principe des Systèmes Informatiques Avancé 7 21/09/10 Principe des Systèmes Informatiques Avancé 8

Architecture orientée service dynamiquement adaptable Adaptation du client au contexte Exemples : OSGi Architecture orientée service dynamiquement adaptable Adaptation du client au contexte Exemples : OSGi 12 - notification Imprimante N/B 11 dé-enregistrement ou détection de départ 13 - recherche Imprimante N/B 11 dé-enregistrement ou détection de départ Imprimante Coul. 14 sélection purinta.lip6.fr ayaku.lip6.fr 15 reconnexion purinta.lip6.fr ayaku.lip6.fr 10 départ 10 départ 21/09/10 Principe des Systèmes Informatiques Avancé 9 21/09/10 Principe des Systèmes Informatiques Avancé 10 Séparation supplémentaire entre modules logiciels Hypothèse forte Un utilisateur conçoit son application en fonction d un service offert et non d une implémentation précise du service Par exemple : j utilise un service météo au lieu de Météo France La liaison avec une implémentation de service est effectuée!! Lors de la conception (programmation classique) Mais l application reste indépendante de l implémentation!! Lors de la compilation!! Pendant l exécution Un contrat ne change jamais (statiquement ou dynamiquement) Modification d un des contrats! renégociation de la relation contractuelle Les services augmentent!! L indépendance entre modules logiciels!! L adaptation dynamique 21/09/10 Principe des Systèmes Informatiques Avancé 11 21/09/10 Principe des Systèmes Informatiques Avancé 12

La plateforme à service OSGi Plateforme à service!! Centralisé (une seule VM)!! Orienté au départ vers les Gateway!! Dynamiquement adaptable!! Liaison (de base) uniquement par appel de méthode!! Pas de couche ou de squelette La plateforme à service OSGi Trois principales implantations de la spécification!! Felix (Apache)!! Eclipse-equinox (IBM) (Moteur à pluggin d eclipse)!! Knopflerfish Corporation indépendante!! Fondée en mars 1999!! Soutenue par de nombreux acteurs (IT, téléphonie, Eclipse, Apache) Remarque : Open Services Gateway Initiative est obsolète 21/09/10 Principe des Systèmes Informatiques Avancé 13 21/09/10 Principe des Systèmes Informatiques Avancé 14 La plateforme à service OSGi Motivation!! Programmation orientée service en Java Surcouche logicielle (middleware) au dessus des JVM!! Cible des systèmes à mémoire restreinte Compatible Java Micro Edition!! Mise à jour dynamique d application sans interruption Notification d arrivée et de départ de service!! Installation, mise à jour, lancement, arrêt, retrait Cycle de vie des applications pris en charge par le middleware!! Résolution des dépendances de version de code Plusieurs versions de la même classe peuvent cohabiter simultanément!! Chargement/déchargement de code en Java Surtout déchargement!!! Communication rapide entre services Pas de souche ou de squelette entre le fournisseur et le client (! centralisé) La plateforme à service OSGi Utilisation classique d OSGi : la domotique HTTP Télé Frigo Bluetooth Middleware OSGi EDF Plateforme domotique, Set Top Box Modem 21/09/10 Principe des Systèmes Informatiques Avancé 15 21/09/10 Principe des Systèmes Informatiques Avancé 16

La plateforme à service OSGi OSGi : deux parties complémentaires Bundle Partie déploiement et cycle de vie!! Chargement de nouvelles applications dans la JVM!! Résolution des dépendances de classes!! Déchargement et mise à jour des applications Partie plateforme à service!! Création, destruction de services!! Annuaire à service!! Notification de changement d état des services Unité fonctionnelle fondamentale de OSGi!! Offre des services!! Se lie (utilise) des services Un bundle est l unité de déploiement d OSGi Désinstallation Machine Virtuelle Java Bundle B1 Bundle B2 Installation Middleware OSGi Bundle B3 21/09/10 Principe des Systèmes Informatiques Avancé 17 21/09/10 Principe des Systèmes Informatiques Avancé 18 Présentation d un bundle Un bundle est un fichier.jar contenant!! Un manifest : la description du bundle!! Des classes Java : le code du bundle!! D autres fichiers.jar : des bibliothèques internes!! Des ressources : des images ou autre Chargement dans la machine virtuelle Java :!! Instanciation de l activateur!! Invocation de la méthode start() dessus Ressources du bundle Description du bundle Description du bundle (le manifest) :!! La classe Activateur : invoquée lors du démarrage ou de l arrêt du bundle!! Les packages requis et les packages offerts!! Des informations supplémentaires Packages exportés CAFEBABE CAFEBABE MANIFEST.MF CAFEBABE Packages importés Mais où sont passés les services?! Instanciés, trouvés ou enregistrés par l activateur Autres classes du bundle Activateur 21/09/10 Principe des Systèmes Informatiques Avancé 19 21/09/10 Principe des Systèmes Informatiques Avancé 20

Sept actions sur les bundles Installe le bundle Charge le bundle dans le système de fichier Résout le bundle Charge le bundle dans la machine virtuelle Démarre le bundle install Appel la méthode start() de l activateur Stop le bundle Appel la méthode stop() de l activteur Désinstalle le bundle Supprime le bundle du système de fichier Met à jour le bundle Ré-installe le bundle Rafraîchie le bundle Reconstruit toutes les liaisons du bundle resolve Installed Resolved uninstall update refresh Uninstalled update start Starting Active stop update refresh Stopping Le descripteur de déploiement : MANIFEST.MF!! Bundle-Name : nom du bundle!! Bundle-Description : chaîne de caractère pour décrire le bundle!! Import-Package : packages importés (au chargement)!! Dynamic-Import-Package : package importés (au fur et à mesure des besoins)!! Export-Package : packages exportés!! Bundle-Activator : classe de l activateur!! Bundle-ClassPath : à l intérieur de Bundle!! Bundle-UpdateLocation : url pour mise à jour du bundle!! Bundle-Version : la version du Bunlde!! Bundle-Vendor : le vendeur du bundle!! Bundle-ContactAddress : adresse mail de contact!! Bundle-Copyright : chaîne de caractère 21/09/10 Principe des Systèmes Informatiques Avancé 21 21/09/10 Principe des Systèmes Informatiques Avancé 22 Exemple de bundle : l activateur Exemple de bundle : le fichier manifest.mf package lip6.simple; import org.osgi.framework.bundleactivator; import org.osgi.framework.bundlecontext; public class Test implements BundleActivator { public void start(bundlecontext context) { System.out.println("Hello!"); Bundle-Name: A simple bundle Bundle-Description: A simple bundle to test deployment Bundle-Vendor: UPMC Bundle-Version: 1.0.0 Bundle-Activator: lip6.simple.test Import-Package: org.osgi.framework Si on exporte le package lip6.simple : Export-Package: lip6.simple public void stop(bundlecontext context) { System.out.println("Goodbye!"); 21/09/10 Principe des Systèmes Informatiques Avancé 23 21/09/10 Principe des Systèmes Informatiques Avancé 24

Le packaging (sources disponibles sur le site du cours : simple.zip) Le déploiement Bundle : fichier jar avec le manifest OSGi Fichier jar = fichier zip! Arborescence classique d un bundle / racine du jar /un-autre-jar.jar des sous-jars (voir Bundle-ClassPath) /une-ressource.avi des ressources annexes /lip6/simple/test.class notre activateur /META-INF/MANIFEST.MF le manifest du bundle Par défaut : Bundle-ClassPath = / Installer felix : http://felix.apache.org/ Lancer felix : java jar $FELIX_PATH/bin/felix.jar Profile felix : un ensemble de bundles installés, plusieurs profiles possibles Voir répertoire ~/.felix/nom-du-profile Pour voir les bundles installés dans le profile : ps (Apache Felix Shell Service : le terminal felix) Installer le bundle : install file:///chemin_complet_du_bundle/simple.jar! copie le.jar dans le profile et lui attribue un BundleID Démarrer/arrêter le bundle : start BundleID/stop BundleID Mettre à jour le bundle : update BundleID 21/09/10 Principe des Systèmes Informatiques Avancé 25 21/09/10 Principe des Systèmes Informatiques Avancé 26 Bundle = application Java OSGi = serveur d application Problème de liaison :!! bundle compliqué : ImportPackage lip6.simple class Test2 extends lip6.simple.test { update du bundle simple!!! Solution : refresh Update de tous les bundles dont dépendent les bundles mis à jour Service OSGi : le contrat Fournisseur : offre un service!! Défini par une interface Java!! Possède des propriétés : couple clé/valeur : cherche un service!! Défini par une interface Java!! Filtre sur les propriétés!! Sélectionne un service qui correspond!! Appel direct sur l instance du service Annuaire OSGi!! Associe des contrats et des instances de service!! Renvoie des références OSGi vers les services (ServiceReference) 21/09/10 Principe des Systèmes Informatiques Avancé 27 21/09/10 Principe des Systèmes Informatiques Avancé 28

Interface du contrat = interface Java! fichier de classe, déployé dans un bundle Règle : éviter de dupliquer le code de l interface i.e. ne pas la charger dans deux bundles différents! L interface d un contrat doit être packagée dans un bundle indépendant (ni le fournisseur, ni le client) Le bundle contrat typique Bundle-Name: HelloWorld interface Bundle-Description: The HelloWorld interface Bundle-Vendor: UPMC Bundle-Version: 1.0.0 Export-Package: lip6.services.helloworld Bonne programmation OSGi! trois classes de bundle!! Les bundles de contrats : contiennent des interfaces + exceptions associées!! Les bundles bibliothèques : contiennent des classes fournies par des tiers!! Les bundles de services : contiennent des services (fournisseurs et/ou clients) Pas requis par la spécification, juste une bonne manière de programmer " lip6.services.helloworld package lip6.services.helloworld; public interface HelloWorld { public void sayhello(); Bundle helloworld.jar MANIFEST.MF CAFEBABE 21/09/10 Principe des Systèmes Informatiques Avancé 29 21/09/10 Principe des Systèmes Informatiques Avancé 30 Le bundle fournisseur typique Le fournisseur de service HelloWorldFr Bundle-Activator: lip6.helloworld.fr.activator Import-Package: org.osgi.framework, lip6.services.helloworld instance du HelloWorldFr CAFEBABE class HelloWorldFr implements HelloWorld MANIFEST.MF CAFEBABE org.osgi.framework lip6.services.helloworld props.put("lang", "Fr"); context.registerservice( HelloWorld.class.getName(), new HelloWorldFr(), props); package lip6.helloworld.fr; public class HelloWorldFR implements HelloWorld { public void sayhello() { System.out.println("Bonjour, monde!"); Manifest du fournisseur Bundle-Name: The french HelloWorld Bundle-Description: The french implementation Bundle-Vendor: UPMC Bundle-Version: 1.0.0 Bundle-Activator: lip6.helloworld.fr.activator Import-Package: org.osgi.framework, lip6.services.helloworld 21/09/10 Principe des Systèmes Informatiques Avancé 31 21/09/10 Principe des Systèmes Informatiques Avancé 32

L activateur du bundle Le bundle client typique package lip6.helloworld.fr; public class Activator implements BundleActivator { public void start(bundlecontext context) { System.out.println("Démarre le helloworld français"); HelloWorld hw = new HelloWorldFR(); Properties props = new Properties(); props.put("lang", "Fr"); context.registerservice( HelloWorld.class.getName(), hw, props); public void stop(bundlecontext context) { System.out.println("Stop le helloworld français"); Bundle-Activator: lip6.helloworld.client.v0.activator Import-Package: org.osgi.framework, lip6.services.helloworld MANIFEST.MF CAFEBABE HelloWorld.class.getName() (Lang=Fr) org.osgi.framework lip6.services.helloworld ServiceReference[] refs = context.getservicereferences( HelloWorld.class.getName(), "(Lang=Fr)"); HelloWorld hw = (HelloWorld)context.getService(refs[0]); 21/09/10 Principe des Systèmes Informatiques Avancé 33 21/09/10 Principe des Systèmes Informatiques Avancé 34 Activateur du client package lip6.helloworld.client.v0; public class Activator implements BundleActivator { public void start(bundlecontext context) throws { ServiceReference[] refs = context.getservicereferences( HelloWorld.class.getName(), "(Lang=Fr)"); if(refs == null) return; HelloWorld hw = (HelloWorld)context.getService(refs[0]); hw.sayhello(); context.ungetservice(refs[0]); Manifest du client Bundle-Name: The simple HelloWorld client Bundle-Description: A simple client for the helloworld service Bundle-Vendor: UPMC Bundle-Version: 1.0.0 Bundle-Activator: lip6.helloworld.client.v0.activator Import-Package: org.osgi.framework, lip6.services.helloworld public void stop(bundlecontext context) { 21/09/10 Principe des Systèmes Informatiques Avancé 35 21/09/10 Principe des Systèmes Informatiques Avancé 36

Propriétés et filtres de recherche expressions LDAP classiques!! Opérateurs de compositions : &,,!!! Opérateurs de regroupement : ()!! Opérateurs d égalité, inégalité : =, <, >!! Clé spéciale objectclass : l interface du service (String) Exemple!! getservicereference(helloworld.class.getname(), " (Lang=Fr)(cpt<18)"); Tous les services de type HelloWorld ayant Lang=fr ou cpt<18!! getservicereferences(null, "&(objectclass=*)(lang=fr)); Tous les services (tous type) ayant Lang=Fr Construction d une application OSGi Bundle contrat :!! Manifest : pas d activateur + export l interface du service!! Code : une interface de service + classes d exception Bundle fournisseur!! Manifest : activateur + importe la plateforme + importe l interface du service!! Activateur : alloue et enregistre une instance du service!! Code : le code de l implémentation du service Bundle client!! Manifest : activateur + importe la plateforme + importe l interface du service!! Activateur : cherche, sélectionne et utilise un founrisseur 21/09/10 Principe des Systèmes Informatiques Avancé 37 21/09/10 Principe des Systèmes Informatiques Avancé 38 = sélection à l exécution du service!! Attend d avoir un service disponible avant d enregistrer le sien!! Choix d un meilleurs service lorsqu il apparaît!! Prise en compte de la disparition d un service Change fondamentalement la façon de programmer Une référence Java n est pas toujours disponible! Intérêt :!! Mise à jour dynamique de morceaux d application (Plugin Eclipse par exemple)!! Adaptation dynamique à l environnement (Maison ubiquitaire par exemple) Événements OSGi!! Départ ou arrivée d un bundle (interface BundleListener)!! Départ ou arrivée d un service (interface ServiceListener)!! Événement sur la plateforme (interface FrameworkListener)!! Autres événements (LogListener, CinfigurationListener, MonitorListener ) Schéma de fonctionnement général!! Recherche initiale de service Si présent, utilise le service le plus adéquat Sinon, attend un service!! Arrivée/départ de service! génération d un événement ServiceListener Si départ de S et si S était utilisé, recommence une recherche initiale Si arrivée de S et si S plus intéressent que service courant, change pour S Si événement modification du service, s assure que le service est toujours adéquat 21/09/10 Principe des Systèmes Informatiques Avancé 39 21/09/10 Principe des Systèmes Informatiques Avancé 40

Le ServiceListener : être informée de l arrivée/départ d un service HelloWorld public class Ecoute implements ServiceListener { public void servicechanged(serviceevent ev) { ServiceReference ref = event.getservicereference(); String objectclasses[] = (String[])ref.getProperty("objectClass"); if(objectclasses[0].equals(helloworld.class.getname()) { switch(ev.gettype()) { case MODIFIED: /* props ont changées */ case REGISTERED: /* arrivée d un fournisseur */ case UNREGISTERING: /* départ d un fournisseur */ Exemple : un client évolué pour HelloWorld!! Thread invoque le service toutes les 5s!! Service préféré en Lang=Fr, si absent, prend le premier!! Dort si aucun service disponible ServiceListener Thread wait() Activator : context.addservicelistener(new Ecoute(), filtre)); 21/09/10 Principe des Systèmes Informatiques Avancé 41 21/09/10 Principe des Systèmes Informatiques Avancé 42 Exemple : arrivée d un HelloWorld avec Lang=En Exemple (1/8) : variables du client ServiceListener Thread 2. Notification 3. Liaison sayhello() wait(5s) HelloWorld Lang=En 4. Invocation 1. Enregistrement HelloWorldEn package lip6.helloworld.client; public class Activator implements BundleActivator, Runnable, ServiceListener { // gestion du thread : stop indique la terminaison private boolean stop; private Thread self; // contexte associé au Bundle private BundleContext context; // référence OSGi vers le service courant (null! absent) private ServiceReference ref; // référence Java vers le service courant private HelloWorld hw; 21/09/10 Principe des Systèmes Informatiques Avancé 43 21/09/10 Principe des Systèmes Informatiques Avancé 44

Exemple (2/8) : gestion du thread Exemple (3/8) : liaison/dé-liaison avec le service (synchronisation à l extérieur) public void run() { try { synchronized(this) { while(!stop) { if(ref == null) wait(); else { hw.sayhello(); wait(5000); catch(exception e) { // pas de service dispo! dort // invoque le service // dort 5s private void useservice(servicereference ref, ServiceReference old) { this.ref = ref; hw = (HelloWorld)context.getService(ref); if(old == null) notify(); // réveille le thread oisif private ServiceReference unuseservice() { if(ref == null) return null; ServiceReference old = ref; context.ungetservice(ref); ref = null; return old; 21/09/10 Principe des Systèmes Informatiques Avancé 45 21/09/10 Principe des Systèmes Informatiques Avancé 46 Exemple (4/8) : recherche initiale Exemple (5/8) : démarrage du bundle public void lookup() throws { ServiceReference old = unuseservice(); // lâche ref actuelle ServiceReference[] refs = // recherche tous les HelloWorld context.getservicereferences( HelloWorld.class.getName(), null); if(refs == null) return; // aucun service trouvé // cherche en premier un service Lang=Fr for(int i=0; i<refs.length && ref==null; i++) if(refs[i].getproperty("lang").equals("fr")) useservice(refs[i], old); // sinon, le premier fait l affaire if(ref == null) useservice(refs[0], old); public void start(bundlecontext context) throws { this.context = context; // gestion thread self = new Thread(this, "The simple HelloWorld client"); self.start(); synchronized(this) { // évite événement pendant start context.addservicelistener( // enregistre this, // le gestionnaire d événement this "(&(objectclass=" + HelloWorld.class.getName() + ")" + "(Lang=*))"); lookup(); // recherche initiale 21/09/10 Principe des Systèmes Informatiques Avancé 47 21/09/10 Principe des Systèmes Informatiques Avancé 48

Exemple (6/8) : fin du bundle Exemple (7/8) : la gestion des événements (1/2) public void stop(bundlecontext context) throws { synchronized(this) { unuseservice(); // lâche le service stop = true; // indique au thread «fini» notify(); // réveille immédiat du thread self.join(); // attend terminaison 21/09/10 Principe des Systèmes Informatiques Avancé 49 public void servicechanged(serviceevent ev) { ServiceReference newref = ev.getservicereference(); synchronized(this) { // à cause du thread switch(ev.gettype()) { case ServiceEvent.REGISTERED: // si arrivée de service if(ref == null) useservice(newref, ref); else if(newref.getproperty("lang").equals("fr") &&!ref.getproperty("lang").equals("fr")) { // un Fr arrive et on utilise un!fr useservice(newref, unuseservice()); break; 21/09/10 Principe des Systèmes Informatiques Avancé 50 Exemple (8/8) : la gestion des événements (2/2) Conclusion OSGi : modèle de plateforme à service locale en Java case ServiceEvent.UNREGISTERING: // si désenregistrement if(newref == ref) // du service utilisé lookup(); // relance une recherche initiale break; case ServiceEvent.MODIFIED: // si modification props if((newref == ref) && // du service utilisé!ref.getproperty("lang").equals("fr")) //!Fr lookup(); // relance une recherche initiale break; Points positifs :!! Très performant : pas de mandataire entre serveur et client!! Uniquement local : de nombreux travaux existent autour de la répartition!! Uniquement en Java pour Java : contribue à obtenir de bonnes performances!!! Technologie en pleine expansion Points négatifs :!! Programmation dynamique difficile à prendre en main!! Déchargement de classe difficile (voir cours chargeur de classes)!! Encore peu d outils d'ingénierie logiciel 21/09/10 Principe des Systèmes Informatiques Avancé 51 21/09/10 Principe des Systèmes Informatiques Avancé 52