Post on 04-Apr-2015
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); } }