Corba

Werbung
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 ...
}
}
Herunterladen