2
L’Interoperabilità
• Individuare paradigmi indipendenti dalla piattaformautili per risolvere un’ampia classe di problemi
• Nascondere il più possibile la complessità senzasacrificare le prestazioni
• Individuare uno strato di sviluppo omogeneorealizzato sui diversi sistemi eterogenei
3
La Programmazione di sistemi eterogenei
• Scrivere programmi che comunicano via socket– Gestire l’eterogeneità a livello applicativo
• Scrivere programmi che comunicano via RPC– Anni ‘80
• Chiamare oggetti remoti come se fosserolocali– A partire dagli anni ’90
4
Il paradigma RPC
Client
Server
ORB
Stub
Skeleton
5
CORBA: uno standard per le Applicazioni Distribuite
• Curato da OMG, più di ottocento membri...• Prima versione adottata in ottobre 91• Prime implementazioni dal 93• Molte le implementazioni, anche free, per
qualunque linguaggio• Interoperabilità assicurata attraverso la
standardizzazione dei protocolli Inter Orb(GIOP, IIOP, etc...)
6
Object Management Architecture
7
CORBA: funzionalità di base (1)
• CORBA è un'ambiente utile per:– integrare applicazioni parzialmente già esistenti– costruire nuove applicazioni distribuite
8
CORBA: funzionalità di base (3)
• Interfacce e Dati sono descritti in un apposito linguaggio indipendente dall’implementazione, detto Interface Definition Language (IDL)
• Lo standard CORBA include la definizione del binding da IDL ai linguaggi di implementazione, come C, C++, Java, COBOL, ....
9
CORBA: funzionalità di base (2)
• Un tipico sistema basato su CORBA è composto da un'insieme di programmi clientche accedono a servizi distribuiti sulla rete
• Architettura peer-to-peer, non client-server– un client può definire servizi– le chiamate al servizio del client si chiamano
callback– sono spesso usate per la notifica asincrona del
cambio di dati sul server
10
CORBA: funzionalità di base (4)
• Le chiamate per default sono bloccanti (stessa semantica dei linguaggi di programmazione)
• Possono però anche essere di tipo asincrono:– dichiarazioni oneway in IDL– uso di servizi specifici: event-service, notification
service, message service
11
L’architettura dell’ORB
12
L’architettura CORBA
13
Architettura dell’ORB, lato client
• Un Client effettua una richiesta (statica o dinamica), utilizzando un "Object Reference" per individuare il servizio
• Il Client deve conoscere il tipo dei parametri• Nel caso statico usa lo stub, nel dinamico
l’Interface Repository (un servizio che consente la consultazione a run-time delle interfacce)
14
Architettura dell’ORB, lato server
• Sul lato server, il codice dell'object implementation viene invocato dall’OA tramite una "up-call”:
– associata a uno skeleton statico generato dal compilatore idl (SSI)
– costruita dinamicamente, utilizzando l'InterfaceRepository (DSI)
15
Trasparenza dei meccanismi dinamici
• La semantica dell'ORB per l'operazione statica o dinamica è esattamente la stessa
• Il server non ha modo di verificare se la richiesta sia stata statica o dinamica
• Il client non ha modo di verificare se il server stia usando SSI o DSI
16
L’architettura dell’ORB, lato server
• L’Object Adapter tratta aspetti quali:– generazione e interpretazione dell'Object
Reference
– corrispondenza tra oggetto e processo che ne implementa il servizio
– invocazione dei metodi
– attivazione, disattivazione delle implementazioni
17
Uso dello IOR tra client e server (1)
• Il sistema più elementare per stabilire una connessione diretta tra client e server è l'uso dello IOR
• Uno IOR, Interoperable Object Reference, costituisce un indirizzo univoco corrispondente ad un'oggetto CORBA
18
Uso dello IOR tra client e server (2)
• Il server genera uno IOR per l'oggetto da rendere accessibile e lo comunica ai potenziali clienti tramite uno dei seguenti mezzi:– file system condiviso– pubblicazione su un server Web trasmissione
off-line – uso del Naming Service
19
Struttura dell’IOR (nel caso di IIOP)
20
Il linguaggio IDL
• E’ l’astrazione usata in CORBA per separare le interfacce degli oggetti dalle loro implementazioni
• Parte dello Standard CORBA di OMG• Ne esistono numerose altre versioni• Standardizzato come standard ISO
21
Il Linguaggio IDL (2)
• E` utilizzato per descrivere le interfacce degli oggetti e i tipi dei parametri
• IDL non e` un linguaggio di programmazione– non serve per implementare gli oggetti o per
realizzare client che accedano agli oggetti
• IDL e` volutamente semplice per essere facilmente mappabile a linguaggi di programmazione poco evoluti
22
Le Interfacce IDL (1)
interface FrontOffice {
readonly attribute string name;
readonly attribute unsigned long numberOfSeats;
Price getPrice(in Place chosenPlace);
boolean bookSingleSeat(in Place chosenPlace, in string creditCard);
};
23
Le Interfacce IDL (2)
• L'interfaccia IDL di un oggetto contiene tutte le informazioni utili per realizzare un client che lo usi
• Una tipica interfaccia contiene la specifica di:– le operazioni supportate dall'interfaccia
(compresa la specifica dei tipi dei parametri e del valore di ritorno)
– gli attributi dell'interfaccia
24
Le Interfacce IDL (3)
• Ogni procedura specifica il nome, il tipo e la modalita` di trasmissione dei suoi parametri– Es: boolean checkIfOpen(in Date when, out Date
nextAvailableDate)
• La modalità di trasmissione può essere:– in: il parametro viaggia dal chiamante (client) al chiamato
(server)– out: il parametro viaggia dal server al client– inout: il parametro viaggia in entrambe le direzioni
25
Alcune caratteristiche dell'IDL confrontate con il C++
• Tutte le definizioni IDL sono public• Non esiste il concetto di private o protected, che
riguardano l'implementazione più delle interfacce• Mancanza di costruttori o distruttori: sostituiti dalle
factory, oggetti capaci di creare altri tipi di oggetti• L'overloading dei nomi delle operazioni è illegale
– funzionalità utile ma difficile da tradurre in linguaggi che non la supportano
26
Il compilatore IDL
• Il compilatore IDL traduce queste specifiche in API e definizione di tipi dipendenti dal linguaggio scelto
27
I binding IDL
• Specificano come usare CORBA da ognuno dei linguaggi supportati– Esistono specifiche ufficiali per:
• C, C++, Smalltalk, COBOL, ADA e Java
– CORBA è comunque giè utilizzabile anche da:• Visual Basic, Modula3, Perl, TCL, Python, Dylan,
Oberon e Objective-C
• Enormi differenze nelle difficoltà di programmazione a seconda dei linguaggi usati
28
Binding a C++
• In C/C++ ci si deve preoccupare di– allocazione/deallocazione degli oggetti (è
suggerito l’uso di smart pointer generati dal compilatore IDL)
– Uso di tipi CORBA per i tipi primitivi (int, long, …)
29
Binding a Java
• In Java la programmazione è molto più elegante
• L’uso di CORBA diventa quasi completamente trasparente
• La mancanza dell’ereditarietà multipla complica l’implementazione dell’ereditarietà in IDL
30
CORBA per le applicazioni Internet
WebBrowser
Internet Rete Servizi Pubblici Backend
Documenti
Web S
erver
http
CGI, ISAPI,NSAPI, Servlet, ASP
Oggetti CORBA
iiopiiop
DB ad Oggetti
Sistemi Legacy
WebBrowser
Orblet
SQL,jdbc,...
http
Inbound Firewall
Outbound Firewall
Utenza
DBApplet
31
Sviluppo di un’applicazione CORBA
• Definire l’interfaccia della classe server• Realizzarla in idl• Compilare l’IDL per produrre stub e skeleton• Scrivere il codice del server e linkarlo con gli skeleton
del servizio• Creare un’istanza del server e collegarla all’ORB• Scrivere il codice del client e linkarlo con gli stub del
servizio
32
L’esempio del Counter
• Problema: Creare un oggetto counter he esponga un metodo increment().
• Ogni chiamata a increment() aggiunge 1 al contatore interno dell’oggetto, e restituisce il nuovo valore del contatore.
33
Il codice del Server
public class Counter {
private int sum;
public Counter () {
sum = 0;
}
public int increment () {
sum ++;
return sum;
}
}
Il codice del Client
public class CountTest {
public static void main (String args[]) {
Counter myCount = new Counter ();
for (int i=0; i<100; i++)
System.out.println (myCount.increment());
}
}
Step 1: Definire le Interfacce
34
Step 2: Interfaccia IDL
module CounterPackage {
interface Counter {
long increment ();
};
};
35
Step 2: scrivere l’IDL
• Mapping tra tipi Java e IDLJava IDLboolean booleanchar charString stringint longlong long longfloat float
module CounterPackage {
interface Counter {long increment ();
};
}
36
Step 3: Compilazione IDL
%> idlj -oldImplBase -fserver count.idlGenera skeleton da linkare al server
Counter.java_CounterImplBase.javaCounterOperations.java
%> idlj -fclient login.idlGenera stub da linkare al client
_CounterStub.javaCounterHolder.javaCounterHelper.java
37
Step 3: Compilazione IDL (2)
package _CounterPackage;/*** _CounterPackage/Counter.java .* Generated by the IDL-to-Java compiler (portable), version "3.2"* from counter.idl* Wednesday, May 3, 2006 7:49:32 AM CEST*/
public interface Counter extends CounterOperations,org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity
{} // interface Counter
38
Step 4: Implementare il Servant
• Identica alla versione sequenziale ma estende lo skeleton
import _CounterPackage.*;
public class Counter extends _CounterImplBase {
private int sum;
public Counter () {
sum = 0;
}
public int increment () {
sum ++;
return sum;
}
}
39
Step 5: Creare l’istanza del Server
– Inizializzare l’ORB– Creare un’istanza dell’oggetto server (servant)– Fare il bind dell’oggetto all’ORB– Ottenere e pubblicare l’IOR per quest’oggetto
40
import org.omg.CORBA.*;
import java.io.*;
public class CounterServer {
public static void main (String args[]) throws Exception {
ORB orb = ORB.init (args, null); // Initialise ORB.
Counter aCounter = new Counter (); // Create new counter.
orb.connect (aCounter); // Register counter with ORB.
String stringobjectref = orb.object_to_string(aCounter);
PrintWriter fout = new PrintWriter (new
FileWriter("ior.txt"),true);
fout.println (stringobjectref);
System.out.println (stringobjectref); // Orb ref.
java.lang.Object sync = new java.lang.Object ();
synchronized (sync) {
sync.wait();
}
}
}
Il codice del Server
41
Step 6: Implementazione del Client
• Inizializzazione dell’ORB• Accesso all’ORB per creare un proxy/stub per
l’accesso all’oggetto remoto• Invocare il metodo sullo stub
42
import _CounterPackage.*;
import org.omg.CORBA.*;
public class CountTest {
public static void main (String args[]) {
ORB orb = ORB.init (args,null);
_CounterPackage.Counter myCount =
CounterHelper.narrow (orb.string_to_object(args[0]));
for (int i=0; i<100; i++)
System.out.println (myCount.increment());
}
}
Il Codice del Client