37
next previou s CORBA: vad, varför, hur? Innehåll Datornätverk Behov och krav CORBA Historik, principer, arkitektur och beståndsdelar Exempel i Java Internetprogrammering Föreläsning 11 Läs också tutorials och annan beskrivning: http://www. javasoft .com/docs/books/tutorial/ idl /index.html JDK1.3 JDK1.2

CORBA: vad, varför, hur?

  • Upload
    tanner

  • View
    30

  • Download
    0

Embed Size (px)

DESCRIPTION

Innehåll Datornätverk Behov och krav CORBA Historik, principer, arkitektur och beståndsdelar Exempel i Java. Internetprogrammering Föreläsning 11. CORBA: vad, varför, hur?. Läs också tutorials och annan beskrivning: http://www.javasoft.com/docs/books/tutorial/idl/index.html - PowerPoint PPT Presentation

Citation preview

Page 1: CORBA: vad, varför, hur?

nextprevious

CORBA: vad, varför, hur?Innehåll

Datornätverk

Behov och krav

CORBA

Historik, principer, arkitektur och beståndsdelar

Exempel i Java

InternetprogrammeringFöreläsning 11

Läs också tutorials och annan beskrivning:http://www.javasoft.com/docs/books/tutorial/idl/index.html

http://java.sun.com/j2se/1.3/docs/guide/idl/index.htmlJDK1.3

JDK1.2

Page 2: CORBA: vad, varför, hur?

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?

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?

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?

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?

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?

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?

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?

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?

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?

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/idlj

och IDL-interfacetblir ett vanligtJava-interface

CORBAs stringblir sedan String

i Java då vi implementerarmotsvarande Java-interface(via idltojava/idlj)

*

*

* I jdk 1.2 används idltojava och i jdk 1.3 idlj

Page 12: CORBA: vad, varför, hur?

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?

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 namnserverorg.omg.CORBA.Object nameServiceRef = orb.resolve_initial_references("NameService");

• Gör om referensen till ett namnkontextobjektNamingContext ncRef =NamingContextHelper.narrow(nameServiceRef);

• Skapa ett en instans av ett objekt som implementerar MyInterface och registrera det i ORBenMyServerClass objectRef = new MyServerClass();orb.connect(objectRef);

Page 14: CORBA: vad, varför, hur?

previous next 14

CORBA

... serversidan ...• Konstruera ett namnkomponentobjekt med ett namn för

objektreferensen som vi vill delaNameComponent 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 anslutajava.lang.Object sync = new java.lang.Object(); synchronized (sync) {sync.wait();}

Page 15: CORBA: vad, varför, hur?

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?

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 namnserverorg.omg.CORBA.Object nameServiceRef =orb.resolve_initial_references("NameService");

• Gör om referensen till ett namnkontextobjektNamingContext 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 = newNameComponent("MittObjektNamn", "");NameComponent path[] = {nc};

Page 17: CORBA: vad, varför, hur?

previous next 17

CORBA

... klientsidan ...• Be namnservern om en referens till det objekt som har samma namn som

namnkomponentobjektetMyInterface 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?

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– i JDK1.3 används kommandot idlj

• 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?

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?

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

http://java.sun.com/j2se/1.3/docs/guide/idl/jidlExample2.htmlexceptionexempelse

Page 21: CORBA: vad, varför, hur?

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.idlidlj –fall 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)

jdk 1.3

Väljaren ser till att både skelett- och stubfiler skapas

Page 22: CORBA: vad, varför, hur?

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?

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?

previous next 24

CORBA

1) Hello World Interfacemodule 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?

previous next 25

CORBA

2) Skapa hjälpklasseridltojava -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)

JDK 1.3: idlj –fall Hello.idl

Page 26: CORBA: vad, varför, hur?

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?

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?

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?

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?

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?

previous next 31

CORBA

5) Kompilera och KörKompilera

javac *.java HelloApp/*.java

Köra) starta namnserver

tnameserv -ORBInitialPort 1050

b) Starta HelloServerjava HelloServer -ORBInitialPort 1050

c) Kör klientjava HelloClient -ORBInitialPort 1050

Anger vi inte portnummer försöker namnservern starta på port 900

Vi kan också ge host för namnservern (både på server och klient), texjava HelloClient –ORBInitialHost faun.nada.kth.se -ORBInitialPort 1050

Page 32: CORBA: vad, varför, hur?

previous next 32

CORBA

Sammanfattning starta och anslut till namnserver

starta namnservertnameserv -ORBInitialPort PORTNUMMER

Starta SERVERjava SERVER -ORBInitialHost IPADRESS

-ORBInitialPort PORTNUMMER

Kör KLIENTjava KLIENT -ORBInitialHost IPADRESS

-ORBInitialPort PORTNUMMER

Page 33: CORBA: vad, varför, hur?

previous next 33

CORBA

Det finns mycket mer om CORBA, bla• DII och DSI, Dynamic Invocation Interface och

Dynamic Skeleton Interface – Se tex http://java.sun.com/j2se/1.3/docs/guide/idl/jidlDSI.html

• I CORBA 3 kommer massa nya saker som asynkron meddelandesändning mm– Se tex

• http://www.cs.wustl.edu/~schmidt/corba.html• http://www.iona.com/hyplan/vinoski

• En fullständigarebeskrivning av CORBA hittar du i tex– Client/Server Programming with JAVA and CORBA av Orfali

och Harkey, Wiley 1998, ca 1020 sidor

Page 34: CORBA: vad, varför, hur?

previous next 34

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/00-01/contents/exempel.html

exempelsidan

Page 35: CORBA: vad, varför, hur?

previous next 35

CORBA

CORBA: Callback • Ett litet exempel som illustrerar hur en klient kan

deklarera ett objekt som kan anropas av servern.

• Baseras på det tidigare Hello World-exemplet– Jämfört med detta exempel lägger vi till ett objekt i klienten

som skickas till servern.

• Då metoden sayHello i servern anropas så anropar servern i sin tur det HelloCallback-objekt som skickas med som parameter från klienten (dvs ett objekt hos klienten anropas).

Kodenpå exempelsidan

Page 36: CORBA: vad, varför, hur?

previous next 36

CORBA

CORBA: Kylanläggning• Ett enkelt system med en kylanläggning med en

”temperaturgivare”. Servern:– temperaturen kan avläsas eller ändras

• En klient– kan läsa av eller ändra temperaturen i kylanläggningen

– kan ansluta ett call-back-objekt som meddelas då temperaturen förändras

– version-A klienten ansluter, anger "monitor" för call-backs, skickar några meddelanden och avslutar

– version-B klienten definierar användardialog

• Version-2 av servern– ges möjlighet för anslutning av flera klienter samtidigt (med en lista av

call-back-objekt)

Kodenpå exempelsidan

Page 37: CORBA: vad, varför, hur?

previous next 37

CORBA

CORBA: Meddelandecentral• En server

– med möjlighet för flera klienter att ansluta med call-back-objekt• rutiner för att ansluta respektive ta bort call-back-objekt

– klienterna kan skicka meddelanden till varandra• namngivna eller till alla

• klienterna kan också be om en lista med namnen på anslutna klienter eller fråga om klient med visst namn är ansluten

• Klienter– Ansluter till server med call-back-objekt

– skickar meddelanden till andra klienter

– implementerar rudimentär dialog

Kodenpå exempelsidan