Download - CORBA: vad, varför, hur?
![Page 1: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/1.jpg)
nextprevious
CORBA: vad, varför, hur?Innehåll
Datornätverk
Behov och krav
CORBA
Historik, principer, arkitektur och beståndsdelar
Exempel i Java
InternetprogrammeringF 10a
Läs också den utmärkta och konkreta tutorialen som du hittar på följande adress:
http://www.javasoft.com/docs/books/tutorial/idl/index.html
Läs också den utmärkta och konkreta tutorialen som du hittar på följande adress:
http://www.javasoft.com/docs/books/tutorial/idl/index.html
![Page 2: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/2.jpg)
previous next 2
CORBA
Nätverk av datorer• Idag har vi ett behov av att kommunicera mellan olika datorer
och annan hårdvara
• Vi vill kunna använda olika sätt att lösa ett problem, tex mha olika programmeringsspråk
• Vi vill ha kostnadseffektiva lösningar
• Vi vill inte binda oss till en viss leverantör
• Troligen finns mycket programvara, ny eller gammal, av olika slag i organisationen
![Page 3: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/3.jpg)
previous next 3
CORBA
CORBA (Common Object Request Broker Architecture)
• Standardisering av distribution konstruerad av OMG (Object Management Group)– OMG en sammanslutning av flera hundra (>600) intressenter
för att standardisera objekttekniker• Digital, HP, SUN, IBM, Oracle, Netscape, Microsoft, Ericsson mfl
• Avsikt– att konstruera ett språk- och plattformsoberoende
objektorienterat system för distribution • Tillåter konstruktion av applikationer som kommunicerar över både
plattforms och språkgränser– minimerar beroendet av både hårdvara och programmeringsspråk
– enklare att använda mjukvara från olika leverantörer
![Page 4: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/4.jpg)
previous next 4
CORBA
... CORBA ...• Baserad på en server-klient-modell
– en server erbjuder service
– en klient utnyttjar den
– på en viss plattform kan vissa objekt ta rollen av servrar medan andra tar rollen av klienter
• Finns bindningar till flera programspråk– C++, ADA, Smalltalk, Java, C, COBOL, ...
![Page 5: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/5.jpg)
previous next 5
CORBA
... CORBA STARTA ...• Starta namnserver
– dvs starta det objekt/program som ansvarar för att hantera namngivna delade (/distribuerade) objekt
• Starta server med objekt– bind objektet till namnservern
– låt servern vänta på att klienter skall kommunicera med dess objekt
• Starta klienter och anslut till servern– fråga namnservern om referens till visst objekt
– skicka meddelanden till objektet
![Page 6: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/6.jpg)
previous next 6
CORBA
• Meddelanden mellan klient och server förmedlas av en mäklare, Object Request Broker (ORB)– dom går aldrig direkt utan alltid via ORBen
• Både klient och server ”isolerar” implementationen av klasser med hjälp av IDLer (Interface Description Language)
Object Request Broker
... CORBA ...
KlientObjektets
implementation
IDL”Skelett”
Meddelande (Request)
IDL”Stubbe”
![Page 7: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/7.jpg)
previous next 7
CORBA
...• På serversidan definierar ett så kallat skelett API:et för
ett serverobjekt
• På klientsidan beskrivs serverns objekt med en så kallad stubbe
• Ett protokoll som heter IIOP (Internet Inter-ORB Protocol) definierar hur transport av objekt och meddelanden mellan server och klienter på binär nivå sker– IIOP specificerades i CORBA 2.0, tidigare var inte denna del
standardiserad vilket gjorde att olika implementationer gjorde på sina egna sätt.
![Page 8: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/8.jpg)
previous next 8
CORBA
CORBA innehåller flera ”services”• Några viktiga är
– Lifscykel, grundläggande mekanismer för att skapa, initiera, ta bort objekt mm
– Relations, hanterar relationer mellan objekt
– Namn, namnger delade objekt så att flera klienter unikt kan referera dem
– Persistens, hanterar persistenta objekt, dvs objekt som är långlivade
– Extern lagring, kan flytta objekt mellan intern och externa lagringsformer
– Transaktion, ger en infrastruktur för att hantera transaktioner
– Händelse, låter objekt kommunicera mha händelser – Parallellkontroll, koordinerar objekt och access till delade resurser
• Några andra (ett urval)– Trader, erbjuder sätt att "hitta" objekt utgående önskad service
– Säkerhet, erbjuder säkerhetsmekanismer som identifiering och auktorisering
– Time, för synkronisering av händelser, hantering av alarm och liknande
![Page 9: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/9.jpg)
previous next 9
CORBA
Kommunikationen mellan klienter och servrar
• Lös koppling till plattform, programspråk och detaljer mha– Adaptorer
• som döljer skillnader
– Brokers• förmedlar meddelanden
– Bryggor mellan protokoll• det finns bryggor mellan olika protokoll
![Page 10: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/10.jpg)
previous next 10
CORBA
CORBA och API-beskrivningar• I CORBA beskrivs gränssnitten (API:erna) för objekten med så
kallade IDL:er, dvs grässnittsbeskrivningar.
• En IDL påminner till stor del om Java:s gränssnittsbeskrivningar (dvs Java:s interface).– En IDL kan dock innehålla konstruktioner som har sitt ursprung i C/C++,
som tex typedef, struct och sequence– Vidare deklareras parametrar till metoder som antingen
• in, parameterns värde skickas med som argument till metoden, dvs den typ av parameteröverföring Java använder sig av
• out, parameterns värde sätts i metoden och anropande variabel förändras• inout, parametern används som både in och out samtidigt
• Gränssnitt organiseras så att ett eller flera gränssnitt definieras i en modul (eng. module)
![Page 11: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/11.jpg)
previous next 11
CORBA
Exempel: Steg 1) Gör gränssnittsbeskrivningmodule MyApp
{
interface MyInterface
{
string myMethod();
};
};
modulenamnetblir ett package
i Java då vi "kör"idltojava
och IDL-interfacetblir ett vanligtJava-interface
CORBAs stringblir sedan String
i Java då vi implementerarmotsvarande Java-interface
(via idltojava)
![Page 12: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/12.jpg)
previous next 12
CORBA
Steg 2) På serversidan ...• I koden på serversidan kontaktar vi först aktuell ORB
• Därefter skapar vi en referens till namnservern
• Vi skapar ett serverobjekt (dvs en vanlig instans i Java) och "registrerar" det hos namnservern
• Till slut låter vi servern vänta på att serva anslutande klienter
![Page 13: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/13.jpg)
previous next 13
CORBA
... så här ser det ut i Java ...• Skapa referens till ORB (args innehåller adress för namnservern)
ORB orb = ORB.init(args, null);
• Fråga ORB om namnserver
org.omg.CORBA.Object nameServiceRef =
orb.resolve_initial_references("NameService");
• Gör om referensen till ett namnkontextobjekt
NamingContext ncRef =
NamingContextHelper.narrow(nameServiceRef);
• Skapa ett en instans av ett objekt som implementerar MyInterface och registrera det i ORBen
MyServerClass objectRef = new MyServerClass();
orb.connect(objectRef);
![Page 14: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/14.jpg)
previous next 14
CORBA
... serversidan ...• Konstruera ett namnkomponentobjekt med ett namn för
objektreferensen som vi vill dela
NameComponent nc =
new NameComponent("MittObjektNamn", "");
NameComponent path[] = {nc};
• Bind objektet objectRef till namnet path i namnservern, så att klienter kan referera till det. Dvs om någon klient sedan ber namnservern om ett objekt med detta namn så får den en referens till objectRef.
ncRef.rebind(path, objectRef);
• Vänta på att klienter skall ansluta
java.lang.Object sync = new java.lang.Object(); synchronized (sync) {sync.wait();}
![Page 15: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/15.jpg)
previous next 15
CORBA
Steg 3) Konstruera klientPå klientsidan refererar vi ORBen på samma sätt som påserversidan, dvs
• Vi kontaktar namnservern
• Vi ber namnservern om referens till namngivet objekt
• Vi skickar meddelanden till objekten
![Page 16: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/16.jpg)
previous next 16
CORBA
... så här ser klientens kod ut i Java ...• Skapa referens till ORB (args anger adress för namnservern även här)
ORB orb = ORB.init(args, null);
• Fråga ORB om namnserver
org.omg.CORBA.Object nameServiceRef =
orb.resolve_initial_references("NameService");
• Gör om referensen till ett namnkontextobjekt
NamingContext ncRef =
NamingContextHelper.narrow(nameServiceRef);
• Konstruera ett namnkomponentobjekt med samma namn som det objekt som skapades på serversidan (som synes på exakt samma sätt också)
NameComponent nc = new
NameComponent("MittObjektNamn", "");
NameComponent path[] = {nc};
![Page 17: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/17.jpg)
previous next 17
CORBA
... klientsidan ...• Be namnservern om en referens till det objekt som har samma namn som
namnkomponentobjektet
MyInterface objectRef =
MyInterfaceHelper.narrow(ncRef.resolve(path));
• Skicka meddelande till serverobjektet (på exakt samma sätt som ett meddelande till ett icke distribuerat objekt)
String result = objectRef.myMethod();
System.out.println("Serverobjektet svarade: " +
result);
Be namnservernom generiskt CORBA-objekt med givet namn
Omvandla referensen tillett Java-objekt
som implementerarinterfacet
![Page 18: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/18.jpg)
previous next 18
CORBA
Konstruera klass och IDL• Konstruera en IDL-beskrivning av gränssnittet mot klassen som konstrueras
– server och klient kan ha olika definitioner (fast ofta används likadan IDL för både server och klienter)
• Generera hjälpklasser– i JDK1.2 används kommandot idltojava
• Skriv server med klassbeskrivning och instans för objektet som klienter skall kunna kommunicera med– Registrera objektet i ORBen och associera det med globalt namn (så att den unikt
kan identifieras hos server och alla klienter). Vanligen används namnserver.
• Skriv klienter som via ORB och (vanligen) namnserver refererar serverobjektet och sedan skickar meddelanden till det
![Page 19: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/19.jpg)
previous next 19
CORBA
IDL (Interface Description Language)
• Ett programspråksneutralt sätt att beskriva en klass
• Några huvuddelar:– statiskt typat
– "fördefinierade" primitiva typer• med long, float, boolean, char, void, any osv
– metoder och argument deklareras med typ
– moduler som innehåller gränssnittsbeskrivningar
– gränssnitt (Interface)• Kan användas som typ
• Kan ärva från andra interface
• Javas Interface har stora likheter med CORBAs interface
– datatyper, konstanter, operationer, fält, parametrar• parametrar deklareras med typ och som in, out eller inout
– undantagshantering (exceptions)• undantag som skall kastas av metoder i klass deklareras i interfaces
any motsvararJavas Object
![Page 20: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/20.jpg)
previous next 20
CORBA
... IDL exempel, modul med fyra gränssnitt ...module CosEventComm {
exception Disconnected {};
interface PushConsumer {
void push (in any event_data) raises (Disconnected);
void disconnect_push_consumer ();};
interface PushSupplier {
void disconnect_push_supplier ();};
interface PullConsumer {
void disconnect_pull_consumer ();};
interface PullSupplier {
any pull () raises (Disconnected);
any try_pull (out boolean has_event) raises (Disconnected);
void disconnect_pull_supplier ();};
};
Kan kastaundantag
event_data:svärde skickasmed som argument
has_eventges värde i metoden try_pull
Undantag deklareras pådetta sätt
![Page 21: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/21.jpg)
previous next 21
CORBA
Java IDL• I Java IDL gör vi först gränssnittsbeskrivningen
– INTERFACE.idl
• Med kommandot idltojava genereras filer som vi kan utnyttja vid skrivandet av server och klienteridltojava INTERFACE.idl
– En katalog med samma namn som modulen skapas och en Java-interface-beskrivning motsvarande IDL-beskrivningen skapas.
– En del hjälpklasser som gör det enkelt att skriva servrar och klienter konstrueras
– Alla dessa klasser definieras automatiskt tillhöra ett package med samma namn som modulen (och därmed också den nyskapade katalogens)
![Page 22: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/22.jpg)
previous next 22
CORBA
...• Följande fem filer skapas:
INTERFACE.java• Javaversionen av interfacet
_INTERFACEImplBase.java• serverskellett som implementerar interfacet
_INTERFACEStub.java• klientstubbe som implementerar interfacet
INTERFACEHelper.java• en klass med statiska hjälpmetoder (tex narrow() som behövs för att ovandla CORBA-objektet till INTERFACE-typen)
INTERFACEHolder.java• "Håller" en instans av INTERFACE och hjälper till att hantera out och inout variabler som ju inte egentligen finns i Java
![Page 23: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/23.jpg)
previous next 23
CORBA
Exempel: Hello World
• Ett enkelt CORBA-exempel där vi konstruerar ett objekt på en server som returnerar en sträng till den klient som ansluter
• Illustrerar hur IDL-beskrivning görs, hur skelett och stubbar samt andra hjälpklasser automatiskt konstrueras, hur en server respektive klient konstrueras, hur namnserver samt server och klient startas
![Page 24: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/24.jpg)
previous next 24
CORBA
1) Hello World Interface
module HelloApp{
interface Hello {
string sayHello();
};
};
Gränssnittet definierar endasten metod, sayHello, vars
resultat (returvärde)är en sträng (string)
![Page 25: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/25.jpg)
previous next 25
CORBA
2) Skapa hjälpklasser
idltojava -fno-cpp Hello.idl
• Katalogen HelloApp och följande filer i denna katalog/package skapas:Hello.java
_HelloImplBase.java
_HelloStub.java
HelloHelper.java
HelloHolder.java
om vi inte vill användaC-preprocessor
(som inte säkert finns)
![Page 26: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/26.jpg)
previous next 26
CORBA
3) Hello World Serverimport HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
class HelloServant extends _HelloImplBase {
int i = 0;
public String sayHello()
{return "\nHello world !! (no: " + ++i + ")\n";}
}
här följer en beskrivningav den klass vars instans vi
vill distribuera
_HelloImplBase implementerarinterfacet Hello.javaoch är ett serverskelett,
dvs en brygga mot ORBen
![Page 27: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/27.jpg)
previous next 27
CORBA
...
public class HelloServer {
public static void main(String args[])
{ try{ORB orb = ORB.init(args, null);
org.omg.CORBA.Object objRef =
orb.resolve_initial_references("NameService");
NamingContext ncRef =
NamingContextHelper.narrow(objRef);
HelloServant helloRef = new HelloServant();
orb.connect(helloRef);
NameComponent nc = new NameComponent("Hello", "");
NameComponent path[] = {nc};
ncRef.rebind(path, helloRef);
kontakta ORB
skapa referenstill
namnserver
instansiera server-objekt och regi-
strera det i ORBen
konstruera namnobjektoch bind serverobjektet
till detta namn inamnservern
![Page 28: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/28.jpg)
previous next 28
CORBA
...
// vänta på att klienter skall ta kontakt
java.lang.Object sync = new java.lang.Object();
synchronized (sync) {
sync.wait();
}
} catch (Exception e) {
System.err.println("ERROR: " + e);
e.printStackTrace(System.out);
}
}}
![Page 29: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/29.jpg)
previous next 29
CORBA
4) Hello World Klientimport HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
public class HelloClient {
public static void main(String args[])
{try{ORB orb = ORB.init(args, null);
org.omg.CORBA.Object objRef =
orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);
NameComponent nc = new NameComponent("Hello", "");
NameComponent path[] = {nc};
Hello helloRef = HelloHelper.narrow(ncRef.resolve(path));
skapa referens tillserverns "Hello"-
objekt
![Page 30: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/30.jpg)
previous next 30
CORBA
...
String hello = helloRef.sayHello();
System.out.println(hello);
} catch (Exception e) {
System.out.println("ERROR : " + e);
e.printStackTrace(System.out);
}
}}
skicka ett meddelande
till serverobjektet
![Page 31: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/31.jpg)
previous next 31
CORBA
5) Kompilera och KörKompilera
javac *.java HelloApp/*.java
Kör
a) starta namnservertnameserv -ORBInitialPort 1050
b) Starta HelloServerjava HelloServer -ORBInitialPort 1050
c) Kör klientjava HelloClient -ORBInitialPort 1050
![Page 32: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/32.jpg)
previous next 32
CORBA
Sammanfattning starta och anslut till namnserver
starta namnservertnameserv -ORBInitialPort PORTNUMMER
starta namnservertnameserv -ORBInitialPort PORTNUMMER
Starta SERVERjava SERVER -ORBInitialHost IPADRESS
-ORBInitialPort PORTNUMMER
Starta SERVERjava SERVER -ORBInitialHost IPADRESS
-ORBInitialPort PORTNUMMER
Kör KLIENTjava KLIENT -ORBInitialHost IPADRESS
-ORBInitialPort PORTNUMMER
Kör KLIENTjava KLIENT -ORBInitialHost IPADRESS
-ORBInitialPort PORTNUMMER
![Page 33: CORBA: vad, varför, hur?](https://reader034.vdocuments.pub/reader034/viewer/2022051215/568142d5550346895daf2d24/html5/thumbnails/33.jpg)
previous next 33
CORBA
Exempel: på att bla definiera metod i klienten som anropas av servern
• I IDL-gränssnittet definierar vi ett gränssnitt för ett objekt som skickas med som parameter från klienten till servern
• Innan klienten anropar servern skapar klienten en instans av detta "call-back-objekt" och registrerar det i ORBen
• Från servern skickar vi ett meddelande till detta objekt som resulterar att en metod på klientsidan utförs
• Kodexempel i callback respektive kylanläggningsexemplen i exempelkatalogen:http://www.nada.kth.se/kurser/kth/2D4334/98-99/contents/exempel.html