Quelques notes sur CORBA F. Boyer, Oct 2003. Principes Programmation distribuée Multi-plateformes...

Preview:

Citation preview

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 d’activation– 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 d’une référence sérialisée dans un

fichier– Réception d’un 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 d’une 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 d’un serveur et d’un 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 d’un Holder

SeqOfPerson listBetween(

in string regexp,

inout long x,

inout long y,

out long size)

0 x y 200

On souhaite obtenir la fenêtre x-ySi y > 200, alors y 200

Utilisation d’un 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 d’un 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 d’un 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 d’un 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 : s’enregistre dans le serveur de noms,

par exemple sous le nom rep_i• Soit les clients savent à qui s’adresser• 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 context6. 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); } }

Recommended