1 6. CORBA Anwendungsobjekte Clientobjekte Serverobjekte Object Request Broker (ORB) Spezielle Objektdienste: Allgemeine Dienste: Namensgebung, Hilfedienste,Drucken, Kopieren, Löschen, ... Sicherheitsdienste, ... • standardisierte, sprachunabhängige (OO-)Middleware • bietet u.a. Zugriff auf entfernte Objekte über entfernte Methodenaufrufe 2 Entfernte Methodenaufrufe Anwendung Ergebnis Aufruf s.m(args) Stumpf s Demarshalling Marshalling ... Objekt o o.m(args) Ergebnis Verteiler Demarshalling Marshalling Ergebnis 3 Beispiel: Corba (hier: Sun OrbD für Java aus J2SDK) 1) Schnittstellen der Server-Klassen in IDL spezifizieren Kunde Branche Umsatz DurchschnittsUmsatz Person Name interface Person{ attribute string Name; }; interface Kunde: Person{ typedef sequence <float,12> UmsatzT; enum Industrie{ Textil, Elektro}; attribute Industrie Branche; attribute UmsatzT Umsatz; float Durchschnittsumsatz(); }; 4 2) IDL-Schnittstellen präcompilieren erzeugte Java-Dateien (alle .java): 1) Kunde, Person: Java-Interfaces für Client-Sicht 2) KundeStub, PersonStub: Client-Stubs; implementieren die Methoden aus 1) 3) KundeOperations, PersonOperations: Java-Interfaces, die IDL-Attribute und -Operationen auf Java-Methoden abbilden. Diese Methoden müssen von zugehörigen Server-Klassen (z.B. KundeImpl,. . . ) implementiert werden. 5 erzeugte Java-Dateien (u.a.): (Forts.) 4) die Server-Klassen lassen sich alternativ einbinden über: ? Vererbung: KundePOA, PersonPOA: abstrakte Oberklassen der Server-Klassen ? Delegation: KundePOATie, PersonPOATie: binden Server-Klassen durch Assoziation an Vorteil: Server-Klassen können anwendungsbezogene Oberklassen haben 6 3) Client-Anwendung implementieren import org.omg.CORBA.ORB; import org.omg.CosNaming.NamingContextExt; import org.omg.CosNaming.NamingContextExtHelper; public class KundeClient { public static void main(String[] args) { try { ORB orb = ORB.init(args,null); org.omg.CORBA.Object objref = orb.resolve initial references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); Kunde kundeProxy = KundeHelper.narrow(ncRef.resolve str("kunde")); kundeProxy.Name("Meier"); float[] umsatz = new float[12]; for (int i=0; i<12; i++) umsatz[i] = (float) i*1000; kundeProxy.Umsatz(umsatz); System.out.println("Durchschnittsumsatz von "+ kundeProxy.Name()+" ("+ kundeProxy.Branche()+"): "+ kundeProxy.DurchschnittsUmsatz());} catch(Exception e){...}} } 7 hierbei: • Operationsnamen bleiben • in-Parameter: call-by-value • (in)out-Parameter: call-by-reference (nicht bei Java) • zu jedem Attribut A: get- und set-Operationen A() bzw. A(v) • Proxy-Objekt kundeProxy repräsentiert entferntes Objekt • Operation auf Proxy-Objekt führt zu Operation auf Server-Objekt • bei Anforderungen an Server: IDL-Datentypen (statt Java-Datentypen) verwenden • IDL unterstützt keine Klassenoperationen 8 4) Implementieren der Server-Schnittstelle import KundePackage.Industrie; class KundeImpl extends KundePOA implements KundeOperations { protected Industrie branche; protected float[] umsatz; protectede String name= ""; public KundeImpl(Industrie b){branche = b;} public String Name(){return name;} public void Name(String n){name = n;} public Industrie Branche(){return branche;} public void Branche(Industrie b){branche = b;} public float[] Umsatz(){return umsatz;} public void Umsatz(float[] u){umsatz = u;} public float DurchschnittsUmsatz(){ float erg = 0; for(int i=0; i<12; i++) erg += umsatz[i]; return erg/12;} } PersonImpl analog 9 5) Server-Hauptprogramm ... imports ... public class KundeServer{ public static void main(String[] args) { Initialisierung, u.a. Serverobjekte bereitstellen und ORB starten ... } }