Quelques notes sur CORBA F. Boyer, Oct 2003. Principes Programmation distribuée Multi-plateformes Notion de client et de serveur Notion de stub et de.

Slides:



Advertisements
Présentations similaires
Bratec Martin ..
Advertisements

NOTIFICATION ÉLECTRONIQUE
Fragilité : une notion fragile ?
SEMINAIRE DU 10 AVRIL 2010 programmation du futur Hôtel de Ville
Phono-sémantique différentielle des monosyllabes italiens
MAGGIO 1967 BOLOGNA - CERVIA ANOMALIES DU SOMMEIL CHEZ L'HOMME
droit + pub = ? vincent gautrais professeur agrégé – avocat
Transcription de la présentation:

Quelques notes sur CORBA F. Boyer, Oct 2003

Principes Programmation distribuée Multi-plateformes Notion de client et de serveur Notion de stub et de squelette

Architecture Servant : étend le squelette ou est un délégué

POA ORB = serveur POA = sous_serveur –Actions effectuées avant / après appels sur les objets distribués –Politique dactivation –Traitement des erreurs

Etapes Définition interfaces IDL Mapping IDL – langages de programmation Implémentation des classes distribuées Réalisation des serveurs Réalisation des clients

Exemple module HelloApp { interface Hello { string sayHello(); // This line is an operation statement. oneway void shutdown(); // This line is another }; };

Génération IDLJ Pour une interface IDL HelloPOA.java (squelette) _HelloStub.java (talon) Hello.java (interface) HelloHolder.java (paramètres out) HelloOperations.java (interface Hello) HelloHelper.java (cast)

Référence distribuée Obtenue par : –Appel au serveur de noms –Lecture dune référence sérialisée dans un fichier –Réception dun paramètre Org.omg.CORBA.Object servant_to_reference(in Servant) Org.omg.CORBA. Servant reference_to_servant(in Object)

Helper HelloHelper : pour forger une référence distribuée de type Hello Les méthodes standarts Corba retournent le type org.omg.CORBA.Object helloRef = HelloHelper.narrow(objRef)

IOR Référence sérialisée String helloIor = orb.object_to_string(helloRef) Hello helloRef = orb.string_to_object(helloIor)

Implémentation dune classe distribuée class HelloImpl extends HelloPOA { private ORB orb; private POA poa; public void setORB(ORB orb_val) { orb = orb_val; } public void setPOA(POA poa_val) { poa = poa_val; } public String sayHello() { return "\nHello world !!\n"; } method public void shutdown() { orb.shutdown(false); } }

Implémentation dun serveur et dun client Voir serveurCorba.html et clientCorba.html

Serveur générique Fichier de propriétés Java poas=rootpoa servants=shutdown;repertory;hello shutdown.class=corbatraining.ShutdownImpl shutdown.poa=rootpoa shutdown.nsbind=Shutdown shutdown.iorfile=ior/shutdown.ior shutdown.codebase=file://build repertory.class=corbatraining.RepertoryImpl repertory.poa=rootpoa repertory.nsbind=Repertory repertory.iorfile=ior/repertory.ior shutdown.codebase=relfile://./build

Gestion du projet Build.xml

Repertory – version 2 RepertoryFactory ClientAdministrateur Repertory pro Repertory fri get get, mget create, delete, get set, modify, remove

Utilisation dun Holder SeqOfPerson listBetween( in string regexp, inout long x, inout long y, out long size) 0xy200 On souhaite obtenir la fenêtre x-y Si y > 200, alors y 200

Utilisation dun Holder Holder = conteneur (objet) qui contient le paramèter de type in ou inout Classes Holder prédéfinies Org.omg.CORBA.BooleanHolder, Org.omg.CORBA.StringHolder, … Classes générées TimeHolder, RepertoryHolder, …

Utilisation dun Holder (suite) // impl : Public class HorlogeImpl extends HorlogePOA { public void getFullTime(shortHolder hour, shortHolder min) { hour.value = …, min.value = …; … // client : shortHolder hour = new shortHolder(); shortHolder min = new minHolder(); Horloge.getTime(hour, min); System.out.println(« hour » + hour.value + « min » + min.value);

Utilisation dun Holder (suite) // idl struct time { short hour; short min }; … // impl public class HorlogeImpl … { public void getTime(timeHolder t) { time _t = new time(); _t.hour = …, _t.min = …; t.value = _t; … // client.time t = new timeHolder(); horloge.getTime(t); System.out.println(« hour » + t.value.hour + « min » + t.value.min);

Utilisation dun Holder (suite) // idl interface Time { void setHour(short h); void setMin (short m);..} … // impl public class HorlogeImpl … { public void getTime(TimeHolder t) { Time _t = new Time(); _t.setHour (…), _t.setMin(…); t.value = _t; … // client.TimeHolder ht = new TimeHolder(); horloge.getTime(ht); Time t = ht.value; System.out.println(« hour » + t.getHour() + « min » + t.getMin());

Répartition de la charge de travail Lancer repertory_i sur Si Repertory_i : senregistre dans le serveur de noms, par exemple sous le nom rep_i Soit les clients savent à qui sadresser Soit lancer un (ou plusieurs) dispatcher, qui va récupérer les références des repertory_1..n et aiguiller les requetes clients en fonction : –De leur nom –De leur localisation –…

Contextes de nommage Cos Naming Service : service de nommage hiérarchisé Bind (NameComponent[], Object o) Rebind (NameComponent[], Corba.Object o) Resolve (NameComponent[]) -> Corba.Object o List() -> BindingIterator

COS Naming Service (deprecated) Exemple serveur: imp = new … org.omg.CosNaming.NameComponent[] name = new NameComponent[1]; name[0] = new Org.omg.CosNaming.NameComponent(); name[0].id = « imprimeur »; name[0].kind= « »; try { naming.bind(name, imp); …

COS Naming Service (deprecated) Exemple client: org.omg.CosNaming.NameComponent[] name = new NameComponent[1]; name[0] = new Org.omg.CosNaming.NameComponent(); name[0].id = « imprimeur »; name[0].kind= « »; try { obj = naming.resolve(name); …

Contextes de nommage Création nom NameComponent [] nameC = ctxt.to_name(« name ») Ajout liaison nom-ref Ctxt.bind(nameC, ref) Ajout contexte de nommage NamingContexteExt ctxt2 = ctxt.bind_new_context(nameC); … Ctxt2.bind (…)

Contextes de nommage (ex) 1.NamingContextExt ctx = NamingContextExtHelper.narrow(orb.resolve_initial_references( "NameService")); 1.NameComponent name2[] = ctx.to_name("Personal"); NamingContextExt ctx2 = (NamingContextExt)ctx.bind_new_context(name2); System.out.println("New naming context, Personal, added!"); 2.NameComponent name3[] = ctx.to_name("schedule"); ctx2.rebind(name3, objref); System.out.println("schedule rebind successful!");

Contexte de nommage (Itérateur) 1.BindingListHolder bl = new BindingListHolder(); BindingIteratorHolder blIt= new BindingIteratorHolder(); nc.list(1000, bl, blIt); 2.Get the array of bindings. This code gets the array of bindings out of the returned BindingListHolder. 3.Binding bindings[] = bl.value; 4.This code loops through the bindings and prints the names out. for (int i=0; i < bindings.length; i++) { 5.int lastIx = bindings[i].binding_name.length-1; // check to see if this is a naming context 6. if (bindings[i].binding_type == BindingType.ncontext) { System.out.println( "Context: " + bindings[i].binding_name[lastIx].id); } else { System.out.println("Object: " + bindings[i].binding_name[lastIx].id); } }