280 likes | 397 Views
Ingegneria del software I. Seminario1: CORBA. Introduzione. CORBA (Common Object Request Broker Architecture) Definita da OMG (Object Management Group) Incapsulamento per la comunicazione tra applicazioni diverse. Architettura. Elementi. IDL ORB
E N D
Ingegneria del software I Seminario1:CORBA
Introduzione • CORBA (Common Object Request Broker Architecture) • Definita da OMG (Object Management Group) • Incapsulamento per la comunicazione tra applicazioni diverse
Elementi • IDL • ORB • Nasconde locazione fisica oggetti interagenti • Permette: invocazione, attivazione, … • Interfacce ORB: • Object Adapter • Dynamic Invocation Interface • Repository • GIOP (General Inter-ORB Protocol) • Nasconde locazione fisica di oggetti in ORB diversi • COS (CORBA Object Services) • Naming services, Transaction services, …
Interface Definition Language • Definisce operazioni utilizzabili su un oggetto. • Ha proprio sistema di tipi • Compilato verso linguaggi principali
Esempio • Interfaccia oggetto conto corrente bancario Interface Conto { attribute string numeroConto; void deposito(int long ammontare); void prelievo(int long ammontare); long saldo(); };
Tipi Primitivi in IDL • Interi • Float • Booleani • Caratteri • Stringhe • Object Reference • Any
Tipi Costruiti in IDL • Struct • Union • Array, Sequences (con lunghezze fisse o variabili) • Enum
Compilazione IDL • Compilatore riceve descrizione IDL e genera interfacce nel linguaggio di implementazione • Specifiche Language Mapping (IDL-Linguaggio impl.) • Genera: • Stub (lato client) • Skeleton (lato server)
Stub • Stub • Interfaccia del client per richiedere servizi • Client invoca localmente lo Stub • Lo Stub impacchetta (marshalling) i dati di invocazione del messaggio • Il messaggio viene consegnato all’ORB • L’ORB lo invia al server
Skeleton • Implementazione oggetto lato server • Scheletro dell’oggetto con sezioni parti da implementare • Coopera con Object Adapter per attivazione dell’oggetto • Riceve richiesta dall’Object Adapter, estrae i dati (unmarshalling) e li passa all’implementazione dell’oggetto
Object Adapter • Si occupa di attivare gli oggetti • Il client mediante stub invoca metodo dell’ORB • ORB notifica invocazione all’OA che attiva implementazione • Implementazione si registra e si dichiara pronta • OA passa invocazione allo skeleton che spacchetta i parametri e li fornisce all’Implementazione • Implementazione esegue metodo, restituisce parametri al client mediante skeleton che gestisce anche eccezioni
Portable Object Adapter • Gestisce le risorse lato server • Stabilisce politiche di memorizzazione e attivazione degli oggetti • Gestisce persistenza
Esempio interazione client-server • Scrittura interfaccia IDL • Compilazione interfaccia • Scrittura implementazione • Scrittura del server • Scrittura del client
Classi • Le classi lato client e lato server formano rispettivamente Stub e Skeleton • Le classi di supporto vengono utilizzate sia dal client che dal server sono proprie del mapping idl2java in questo caso • Helper: funzioni di utilità per le gestione oggetti • Holder: gestione parametri in uscita, non presente in java
public class ContoImpl extends ContoPOA { private int _saldo; private String _numeroConto; public ContoImpl(String arg) { _saldo = 0; _numeroConto = arg; } public void deposito(int amount) { _saldo += amount; } public int prelievo(int amount) { _saldo -= amount; return _saldo; } public int saldo() { return _saldo; } String numeroConto() { return _numeroConto; } void numeroConto(String arg) { _numeroConto = arg; } } Implementazione oggetto Conto
public class Server { public static void main( String[] args ) { // Inizializzazione ORB org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); try { // Creazione riferimento al POA org.omg.PortableServer.POA poa = org.omg.PortableServer.POAHelper.narrow(orb.resolve_initial_references("RootPOA")); // Attivazione oggetto nel POA org.omg.CORBA.Object o = poa.servant_to_reference(new ContoImpl("0393")); poa.the_POAManager.activate(); // Pubblicazione OR in un file PrintWriter ps = new PrintWriter(new FileOutputStream(new File( args[0] ))); ps.println( orb.object_to_string( o ) ); ps.close(); } catch ( Exception e ) { e.printStackTrace(); } // Attivazione ORB orb.run(); } } Classe Server
public class Client { public static void main(String args[]) { try { // Inizializzazione dell’ORB org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,null); // Dichiarazione della variabile per l’oggetto Conto contoBancario; // Reperimento dell’Object Reference da file BufferedReader in = new BufferedReader(new FileReader(args[0])); String IORString = in.readline(); // Creazione riferimento remoto all’oggetto contoBancario = ContoHelper.narrow(orb.string_to_object(IORString)); // Invocazione operazioni sull’oggetto contoBancario.deposito(2000); contoBancario.prelievo(200); System.out.println("Il saldo del conto" + contoBancario.numeroConto() + "è: " + contoBancario.saldo()); } catch (Exception e) { e.printStackTrace(); } } Classe Client
Dynamic Invocation Interface • Nell'esempio: collegamento statico tra client e server, codice oggetto server conosciuto dal client a tempo di compilazione • Per costruire collegamenti dinamici a oggetti non conosciuti a tempo di compilazione si usa DII • QueryInterface
Dynamic Invocation Interface • Codice interpretato per invocare operazioni su nuovi oggetti. • Unica interfaccia per tutte le operazioni su tutte le istanze. • Permette query asincrone.
ORB interface • Permette accesso ai servizi CORBA • Accesso all'Interface Repository • Costruzione di DII • Operazioni su Object Reference • Operazioni su politiche • Costruzione di valuetype
Esempi di servizi • Naming service • Permette di mettere in relazione nomi e riferimenti ad oggetti • Metodi per binding e resolve • Trading service • Permette di ritrovare oggetti con certe caratteristiche
IIOP • GIOP: astratto rispetto al livello di trasporto • IIOP: mapping di GIOP su TCP/IP • Specifica informazioni di indirizzamento dell’oggetto
Object Reference remota IOR contiene indirizzo IP e numero di porta su cui è in ascolto il server Specifica IDL di uno IOR module IIOP { //PIDL struct Version { octet major; octet minor; }; struct ProfileBody_1_1 { Version iiop_version; string host; unsigned short port; sequence<octet> object_key; sequence<IOP::TaggedComponent> components; }; }; IOR