Dipartimento di Informatica Università degli Studi di Pisa Remote Method Invocation Laura Ricci 1 Università degli Studi di Pisa Dipartimento di Informatica Lezione n.9 LPR – Informatica Applicata RMI-Remote Method Invocation 09/05/2013 Laura Ricci
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 1
Università degli Studi di Pisa Dipartimento di Informatica
Lezione n.9LPR – Informatica Applicata
RMI-Remote Method Invocation
09/05/2013Laura Ricci
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 2
RIASSUNTO DELLA LEZIONE
• paradigma di interazione domanda/risposta• remote procedure call• RMI (Remote Method Invocation): API JAVA• un esempio• un servizio di esecuzione distribuita di task
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 3
PARADIGMA DI INTERAZIONE A DOMANDA/RISPOSTA
Paradigma di interazione basato su richiesta/risposta
• il client invia ad un server un messaggio di richiesta di un servizio• il server risponde con un messaggio di risposta• il client rimane bloccato (sospende la propria esecuzione) finchè non
riceve la risposta dal server• paradigma di interazione sincrona
Client Server
Bloccato In elaborazione
richiesta
risposta
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 4
REMOTE PROCEDURE CALL
Esempio interazione domanda/risposta: • un client richiede ad un server la stampa di un messaggio. Il server
restituisce al client un codice che indica l’esito della operazione. Il client attende l’esito dell’operazione
• richiesta del client al server = invocazione di una procedura definita sul server
• il client invoca una procedura remota RPC (Remote Procedure Call)• i meccanismi utilizzati dal client sono gli stessi utilizzati per una normale
invocazione di procedura, ma …– l’invocazione di procedura avviene sull’ host su cui è in esecuzione il
client– la procedura viene eseguita sull’ host su cui è in esecuzione il server– i parametri della procedura vengono inviati automaticamente sulla
rete dal supporto all’RPC
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 5
REMOTE PROCEDURE CALL
PROCESSO CLIENT PROCESSO SERVER
print (msg)
proceduraremota print(…)
codice
bloccato
Esempio: richiesta stampa di messaggio e restituzione esito operazione
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 6
REMOTE METHOD INVOCATION
JAVA RMI: JAVA API per la programmazione distribuita ad oggetti
Evoluzione di RPC = paradigma di interazione basato su oggetti distribuiti
remote method invocation (RMI): evoluzione del meccanismo di invocazione di procedura remota al caso di oggetti remoti permette di ottenere un riferimento ad un oggetto RO allocato su un host remoto, su cui è in esecuzione un'altra istanza della JVM e di usarlo come se RO fosse allocato sulla JVM locale.
È possibile: invocare metodi sulla istanza remota dell'oggetto passare oggetti come argomenti dell'invocazione del metodo restituire oggetti come risultato dell'esecuzione del metodo
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 7
RMI: CONCETTI GENERALI
• Remote Method Invocation: l'idea fondamentale è quella di chiedere servizi ad oggetti allocati sulla rete come se fossero oggetti locali
• Fornire accesso ad oggetti allocati su nodi diversi, rispetto a chi usufruisce del servizio, per richiedere servizi a questi nodi
OggettoOvunque cc;
cc. metodo ( )
• Permette di utilizzare oggetti remoti come se fossero oggetti locali, senza doversi occupare dei protocolli, di stabilire una connessione, degli stream di input/output, etc,etc.
• Le uniche operazioni da effettuare rispetto ad un oggetto locale sono:– il server deve 'esportare' gli oggetti i cui metodi possono essere invocati
da remoto– il client deve individuare un riferimento all'oggetto remoto. Questa
operazione è diversa dall'allocare un oggetto o riceverlo come parametro–
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 8
RMI: I MECCANISMI DI BASE
• Stub: alla lettera, “mozzicone”– segmento di codice locale al client – rappresenta il proxy (rappresentante) dell'oggetto remoto
• Skeleton (talvolta riferito come stub): – segmento di codice allocato sull'host che ospita l'oggetto remoto.– riceve le invocazioni remote dallo stub e le passa all'oggetto allocato
sull'host remoto• Altri meccanismi utilizzati da RMI
– Serializzazione per trasmettere gli oggetti argomento dei metodi– Dynamic Class Loading per inviare codice sulla rete– Security Manager per garantire sicurezza nell'esecuzione di metodi
caricati da remoto
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 9
RMI: CONCETTI GENERALI
Naming Service:Object Registry
Client ServerO2: oggetto
remoto (invocato)
Esportazione (registrazione)
O2 Skeleton (o Stub)
Riferimento all’oggetto remoto
Invocazione metodi
Interazione logicaInterazione fisica
O2 Stub
Network Support Network Support
O1:invocante
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 10
RMI: CONCETTI GENERALI
• L'architettura RMI prevede quindi tre entità– registry– client– server
• Il registry è un servizio di naming che agisce da 'yellow pages'– registra i nomi simbolici degli oggetti i cui metodi possono essere
invocati da remoto ed i riferimenti ai rispettivi stub(skeleton)– gli oggetti remoti devono registrarsi, 'fare un bind' presso il registry– gli altri oggetti possono richiedere, 'fare il lookup' degli oggetti
registrati chiedendo, a partire dal nome pubblico dell'oggetto, un riferimento all'oggetto stesso
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 11
OGGETTI DISTRIBUITI: ARCHITETTURA GENERALE
Il server che definisce l’oggetto remoto:• definisce un oggetto distribuito = un oggetto i cui metodi possono essere
invocati da parte di processi in esecuzione su hosts remoti• esporta (pubblica) l’oggetto: crea un mapping
nome simbolico oggetto-riferimento all’oggettoe lo pubblica mediante un servizio di tipo registry
Quando il client vuole accedere all’oggetto remoto• ricerca un riferimento all’oggetto remoto mediante i servizi offerti dal
registry• invoca i metodi definiti dall’oggeto remoto (remore method invocation). • invocazione dei metodi di un oggetto remoto
– a livello logico: identica all’ invocazione di un metodo locale– a livello di supporto: è gestita dallo stub che provvede a trasformare i
parametri della chiamata remota in dati da spedire sulla rete.• il network support provvede quindi all’invio vero e proprio dei dati sulla rete
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 12
RMI: ARCHITETTURA GENERALE
Naming Service:Object Registry
Client ServerO2: oggetto
remoto (invocato)
STEP 1upload dello stub nel registrybind dello stub ad un nome simbolico
O2 Skeleton o Stub
STEP 2ricerca di un oggetto nel registrydownload dello stub
STEP 3comunicazione con
l'oggetto remoto mediante lo stub
Interazione logicaInterazione fisica
O2 Stub
Network Support Network Support
O1:invocante
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 13
OGGETTI DISTRIBUITI: ARCHITETTURA GENERALE
Quando il server che gestisce l’oggetto remoto riceve un’invocazioneper quell’oggetto• il network support passa i dati ricevuti allo stub dell'oggetto• lo stub trasforma i dati ricevuti dal network support
– in una invocazione ad un metodo locale– occorre trasformare i dati ricevuti dal network support nei
parametri del metodo invocato
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 14
RMI: API JAVA
I metodi definiti dall’oggetto remoto ed i rispettivi parametri (le segnaturedei metodi) devono essere noti:• al client, che richiede un insieme di servizi mediante l’invocazione di tali
metodi• al server, che deve fornire un'implementazione di tali metodi
Il client non è interessato all' implementazione di tali metodi
In JAVA: • definizione di un' interfaccia che contiene le segnature di un insieme di
metodi, ma non il loro codice
• definizione di una classe che implementi l’interfaccia: contiene il codice dei metodi elencati nella interfaccia
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 15
INTERFACCE JAVA: RIPASSO
Una interfaccia JAVA può contenere solamente:
• metodi astratti e costanti: niente costruttori, niente variabili, solo l'intestazione dei metodi.
• i metodi sono tutti astratti, anche se manca la parola chiave abstract: infatti al posto del corpo c'è solo un punto e virgola;
• si può dichiarare che una classe implementa (implements) una data interfaccia: deve allora fornire un'implementazione per tutti i suoi metodi.
• una classe può implementare più di una interfaccia: la relazione implements non deve rispettare la regola dell'ereditarietà singola
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 16
INTERFACCE: RIPASSO
interface Figure {
/* gli oggetti delle classi che realizzano questa interfaccia sono caratterizzati da un tipo e da un'area
*/
double area( );
String tipo( );
}
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 17
INTERFACCE: RIASSUNTO
class RadiceFigure { protected double dim1; protected double dim2;
RadiceFigure(double a, double b) { dim1 = a; dim2 = b; } }
class Rectangle extends RadiceFigure implements Figure{ Rectangle(double a, double b) { super(a, b); } // definisce area() di Figure public double area( ) { return dim1 * dim2; }
// definisce tipo() di Figure public String tipo( ) { return "Rectangle";} }
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 18
INTERFACCE: RIASSUNTO
class Triangle extends RadiceFigure implements Figure { Triangle(double a, double b) {super(a, b);}
// definisce area( ) di Figure public double area( ) { return dim1 * dim2 / 2; }
// definisce tipo( ) di Figure public String tipo( ) {return "Triangle "; }
}
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 19
INTERFACCE: RIPASSO
class prova {public static void main (String args[ ]) {
// Figure f = new Figure(10, 10); // questo è illegaleFigure figref; // OK non creo l' oggetto figref = new Rectangle(9, 5);System.out.println(figref.tipo( ) + figref.area( ));figref = new Triangle(10, 8);System.out.println(figref.tipo( ) + figref.area( ));// figref.dim1 = 0 ; //anche questo e` illegale
}
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 20
JAVA: REMOTE INTERFACE
Esempio : un Host è connesso ad una stazione metereologica che rilevatemperatura, umidità,….mediante diversi strumenti di rilevazione. Sull’host èin esecuzione un server che fornisce queste informazioni agli utentiinteressati.
import java.rmi.*;
public interface weather extends Remote;
public double getTemperature ( ) throws RemoteException;
public double getHumidity ( ) throws RemoteException;
public double getWindSpeed ( ) throws RemoteException;
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 21
JAVA RMI
• L'oggetto remoto deve essere descritto mediante una interfaccia, poichè il client non possiede una copia del codice dell'oggetto, ma deve manipolarlo
• L'interfaccia che definisce i metodi dell'oggetto remoto deve: – estende l’interfaccia Remote. – Remote è una interfaccia che non definisce alcun metodo. Il solo scopo è quello di identificare gli oggetti che possono essere utilizzati in remoto– i metodi definiti devono dichiarare di sollevare eccezioni remote. Una
eccezione remota indica un generico fallimento nella comunicazione remota dei parametri e dei risultati al/dal metodo remoto
– La dichiarazione delle eccezioni viene effettuata mediante la clausola throws:
• la clausola throws associata ad un metodo indica che il metodo può sollevare una eccezione, ma non la intercetta e non la gestisce
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 22
STATISTICHE UNIONE EUROPEA
Illustreremo un'applicazione RMI mediante il seguente esempio:
Definire un oggetto remoto che fornusca le principali informazionirelative ai paesi della Unione Europea (linguaggio ufficiale, popolazione,nome della capitale) e che restituisca queste informazioni ai client che lerichiedono
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 23
PASSO 1: DEFINIZIONE DELL'INTERFACCIA
import java.rmi.Remote;import java.rmi.RemoteException;
public interface EUStats extends Remote {String getMainLanguages(String CountryName)
throws RemoteException;
int getPopulation(String CountryName)throws RemoteException
String getCapitalName(String CountryName)throws RemoteException;
}
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 24
EUDATA: UNA CLASSE D'APPOGGIO
class EUData {private String Language;private int population;private String Capital;EUData(String Lang, int pop, String Cap) {
Language = Lang;population = pop;Capital = Cap;}
String getLangs( ) { return Language; } int getPop( ) { return population; } getCapital( ) { return Capital; }}
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 25
PASSO 2: IMPLEMENTAZIONE OGGETTO REMOTO
• Utilizziamo una hash table per memorizzare i dati riguardanti le nazioni europee. In questo modo definiamo un semplice data base contente informazioni sulle nazioni
– viene utilizzata la classe EUData per definire oggetti (record) che descrivono la singola nazione
– la classe verrà definita in seguito
• Definizione di una classe EuStatServer che implementa l'oggetto remoto e ne crea una istanza
– implementa la interfaccia EUStats– il main della classe contiene il launch code dell'oggetto remoto
• crea una istanza dell'oggetto remoto e ne crea lo skeleton (stub)• associa allo stub dell'oggeto remoto un nome simbolico e registra il
collegamento nome simbolico stub nel registry
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 26
PASSO 2: IMPLEMENTAZIONE OGGETTO REMOTO
import java.rmi.*; // Classes and support for RMIimport java.rmi.server.*; // Classes and support for RMI servers import java.util.Hashtable; // Contains Hashtable classpublic class EUStatsServer implements EUStats {/* Store data in a hashtable */
Hashtable<String, EUData> EUDbase = new Hashtable<String, EUData>();
/* Constructor - set up database */ EUStatsServer() throws RemoteException { EUDbase.put("France", new EUData("French",57800000,"Paris")); EUDbase.put("United Kingdom", new EUData("English",
57998000,"London")); EUDbase.put("Greece", new EUData("Greek",10270000,"Athens"));
........ }
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 27
PASSO 2: IMPLEMENTAZIONE OGGETTO REMOTO
/* implementazione dei metodi dell'interfaccia */
public String getMainLanguages(String CountryName) throws RemoteException {
EUData Data = (EUData)EUDbase.get(CountryName);return Data.getLangs();}
public int getPopulation(String CountryName) throws RemoteException {
EUData Data = (EUData)EUDbase.get(CountryName);return Data.getPop(); }
public String getCapitalName(String CountryName) throws RemoteException {
EUData Data = (EUData)EUDbase.get(CountryName);return Data.getCapital( ); }
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 28
PASSO 3: LAUNCH CODE
public static void main (String args[]) {try {
/* Creazione di un'istanza dell'oggetto EUStatsServer */EUStatsServer statsServer = new EUStatsServer();
/* Esportazione dell'Oggetto */ EuStats stub = (EuStats) UnicastRemoteObject.exportObject(statsServer, 0);
/* Creazione di un registry sulla porta args[0] LocateRegistry.createRegistry(args[0]); Registry r=LocateRegistry.getRegistry(args[0]);
/* Pubblicazione dello stub nel registry */ r.rebind("EUSTATS-SERVER", stub);
•System.out.println("Server ready");}/* If any communication failures occur... */catch (RemoteException e) {System.out.println("Communication error " + e.toString());}}}
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 29
PASSO 3: LAUNCH CODE
Il launch code del server:• crea un'istanza dell'oggetto • invoca il metodo statico UnicastRemoteObject.exportObject(obj, 0) che
– esporta l'oggetto obj creato trasformando la classe associata in una classe accessibile via RMI, cioè in una classe tale che le invocazioni ai suoi metodi possano essere ricevute sulla porta specificata.
– restituisce lo stub dell'oggetto remoto che contiene uno scheletro per ogni metodo definito nell'interfaccia (con le solite segnature), ma in cui l'invocazione di un metodo viene trasformata in una richiesta ad un host ed ad una porta remota
– Porta 0 = viene utilizzata la porta standard di RMI• dopo aver eseguito il metodo, un server RMI aspetta invocazioni di metodi
remoti su un serversocket legato alla porta specificata• lo stub generato (da passare al client) contiene indirizzo IP e porta su cui è
attivo il server RMI
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 30
CREAZIONE DELLO STUB
• Il server deve generare lo stub e renderlo disponibile al client• Nelle prime versioni di JAVA
– Poichè non esiste il metodo exportObject, la classe EUStatsServer deve estendere la classe UnicatRemoteObject e si elimina la istruzione per l'esportazione dell'oggetto
– Lo stub viene generato mediante rmic (rmi compiler) • Nelle ultime versioni di JAVA è invece possibile utilizzare la exportObject
per generare lo stub• Per invocare i metodi dell'oggetto remoto, il client deve avere a
disposizione lo stub dell'oggetto• JAVA mette a disposizione del programmatore un semplice name server
(registry) che consente– Al server di registrare lo stub con un nome simbolico– Al client di reperire lo stub tramite il suo nome simbolico
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 31
JAVA: ESPORTAZIONE DELLO STUB
Il Server• per rendere disponibile lo stub creato agli eventuali clients, inserisce un
riferimento allo stub creato in un registry locale LocateRegistry.createRegistry(args[0]); Registry r=LocateRegistry.getRegistry(args[0]);
• Registry = simile ad un DNS per oggetti remoti, contiene legami tra il nome simbolico dell’oggetto remoto ed il riferimento all’oggetto
EUSTAT-SERVER
riferimento allo stub
nome servizio riferimento
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 32
RMI: IL SERVER
• Il modo più semplice di utilizzare il registry, è quello di utilizzare la classe LocateRegistry
• Consente di gestire oggetti di tipo Registry direttamente da JAVA• La classe LocateRegistry contiene un insieme di metodi per la gestione del
registry– startRegistry– getRegistry– …..
• ma...come vedremo in seguito il registry può essere attivato anche su un host diverso sia dal client che dal server. Analizzeremo questo scenario in seguito
Dopo che il server ha registrato lo stub relativo all'oggetto remoto esportato,• il main termina• esiste comunque un thread attivo in attesa di invocazione di metodi remoti
sul serversocket associato, per cui il programma non termina
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 33
IL CLIENT RMI
Per accedere all'oggetto remoto, il client • deve ricercare lo stub dell'oggetto remoto
• accede al registry attivato sul server mediante il nome simbolico dell'oggetto remoto..Il riferimento restituito è un riferimento allo stub dell'oggetto
• il riferimento restituito è di tipo generico Object: è necessario effettuarne il casting al tipo definito nell’interfaccia remota
• invoca i metodi dell’oggetto remoto come fossero metodi locali (l'unica differenza è che occorre intercettare RemoteException)
• poichè il client scarica lo stub, che è una segmento di codice (una classe) deve utilizzare un meccanismo per verificarne la affidabilità
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 34
IL CLIENT RMI
import java.rmi.*;public class EUStatsClient {public static void main (String args[]) {
EUStats serverObject;Remote RemoteObject;/* Check number of arguments *//* If not enough, print usage string and exit */if (args.length < 2) {System.out.println("usage: java EUStatsClient
port countryname");return; } /* Set up a security manager as before */ System.setSecurityManager(new RMISecurityManager());
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 35
IL CLIENT RMItry {Registry r= LocateRegistry.getRegistry(args[0]);
RemoteObject=r.lookup("EUSTATS-SERVER");
serverObject = (EUStats)RemoteObject;
System.out.println("Main language(s) of " + args[1] + "
is/are " + serverObject.getMainLanguages(args[1]));
System.out.println("Population of " + args[1] + " is "
+ serverObject.getPopulation(args[1]));
System.out.println("Capital of " + args[1] + " is "
+ serverObject.getCapitalName(args[1]));}
catch (Exception e) {
System.out.println("Error in invoking object method " +
e.toString() + e.getMessage());
e.printStackTrace();}}}
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 36
IL CLIENT RMI
• Gli argomenti passati al client da riga di comando sono il nome del paese Europeo di cui si vogliono conoscere alcune informazioni e la porta su cui è in esecuzione il servizio di Registry.
• Remote indica un oggetto remoto su cui devo fare il casting al tipo definito dalla interfaccia EUStats
• NOTA BENE: l'invocazione dei metodi remoti avviene mediante lo stesso meccanismo utilizzato per l'invocazione dei metodi locali
• Compilazione ed invocazione del clientJavac EUStats.java Javac EUStatsClient.java
Java EUStatsClient ip-host countryname
• NOTA BENE: quando viene compilato il codice del client, il compilatore JAVA ha bisogno di accedere al file class corrispondente all'interfaccia, EUStats.class
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 37
JAVA: IL REGISTRY
• L'RMI Registry è stato pienamente integrato in JAVA nelle ultime versioni proposte
• La classe java.rmi.registry.LocateRegistry contiene metodi per controllare il registry direttamente da JAVAimport java.rmi.registry.*;java.rmi.registry.LocateRegistry.createRegistry(1099):Naming.rebind(“serverName”, server)
• Si utilizza la classe LocateRegistry che contiene metodi per creare un registry
• si può anche specificare il nome di un host e/o una porta per creare il servizio di registry su uno specifico host e/o porta
– Per reperire un registry eventualmente attivato da shell utilizzare la classe Naming
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 38
JAVA: ATTIVAZIONE DEL SERVIZIO
Per rendere disponibile i metodi dell’oggetto remoto, è necessario attivaredue tipi di servizi• il registry che fornisce il servizio di registrazione di oggetti remoti
– prima di mandare in esecuzione il server il registry deve essere attivato da linea di comando
• il server implementato fornisce accesso ai metodi remoti
E' anche possibile attivare un servizio di registry da shell:> rmiregistry & (in LINUX)> start rmiregistry (in WINDOWS)
• viene attivato un registry associato per default alla porta 1099• se la porta è già utilizzata, viene sollevata un’eccezione. Si può anche
scegliere esplicitamente una porta> rmiregistry 2048 &
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 39
JAVA: ATTIVAZIONE DEL SERVIZIO
Per rendere disponibile i metodi dell’oggetto remoto, è necessario attivaredue tipi di servizi• il registry che fornisce il servizio di registrazione di oggetti remoti
– prima di mandare in esecuzione il server il registry deve essere attivato da linea di comando
• il server implementato fornisce accesso ai metodi remoti
E' anche possibile attivare un servizio di registry da shell:> rmiregistry & (in LINUX)> start rmiregistry (in WINDOWS)
• viene attivato un registry associato per default alla porta 1099• se la porta è già utilizzata, viene sollevata un’eccezione. Si può anche
scegliere esplicitamente una porta> rmiregistry 2048 &
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 40
RMI REGISTRY
• LocateRegistry.getRegistry( ) restituisce un riferimento ad un registry allocato sull'host locale e sulla porta di default 1099
• Se si vuole eseguire il registry su una porta diversa, occorre specificare il numero di porta da linea di comando, al momento dell'attivazione
start rmiregistry 2100• la stessa porta va indicata sia nel client che nel server al momento del
reperimento del riferimento al registro, mediante LocateRegistry.getRegistry
Registry registry = LocateRegistry.getRegistry(2100);• nel caso più semplice si utilizza un registry locale, attivato sullo stesso host
su cui è in esecuzione il server• se non ci sono parametri oppure se il nome dell'host è uguale a null, allora
l'host di riferimento è quello locale• NOTA BENE: il registry ha bisogno dell'interfaccia e dei .class, per cui
attenti a come sono impostati i path!
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 41
JAVA: IL REGISTRY
Supponiamo che registry sia l'istanza di un registro individuato mediantegetRegistry( )
• registry.bind() crea un collegamento tra un nome simbolico (qualsiasi) ed un riferimento all’oggetto. Se esiste già un collegamento per lo stesso oggetto all’interno dello stesso registry, viene sollevata una eccezione
• registry.rebind() crea un collegamento tra un nome simbolico (qualsiasi) ed un riferimento all’oggetto. Se esiste già un collegamento per lo stesso oggetto all’interno dello stesso registry, tale collegamento viene sovrascritto
• è possibile inserire più istanze dello stesso oggetto remoto nel registry, con nomi simbolici diversi
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 42
REGISTRY: ALTRI METODI
Poichè il registry RMI è a sua volta un server RMI, è possibile creare unagerarchia di registry LocateRegistry.createRegistry(1099);
Registry theRegistry = LocateRegistry.getRegistry(1099):Registry myRegistry = LocateRegistry.createRegistry(1664);theRegistry.rebind(“myRegistry”,myRegistry);myRegistry.rebind(“someServer”,server);String registryName = “myRegistry”;String name = “someServer”;Remote regObj = theRegistry.lookup(registryName);Registry reg = (Registry) regObj;RemoteObject = reg.lookup(name):serverObject = (server) RemoteObject:
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 43
RMI: “UNDER THE HOOD”
• Analizziamo le caratteristiche di un servizio remoto– non vogliamo analizzare dettagliatamente l'implementazione– studiamo il comportamento tramite un insieme di esempi
• Vogliamo capire:– poiché esiste un solo oggetto remoto, i metodi di quell'oggetto possono
essere invocati in modo concorrente da client diversi o da thread diversi dello stesso client?
– In caso affermativo, viene creato un thread per ogni richiesta? Per ogni client?
– cosa accade se non sincronizzo opportunamente gli accessi sull'oggetto remoto?
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 44
RMI: INVOCAZIONE CONCORRENTE DI METODI
Per verificare se i metodi dell'oggetto remoto sono invocati in modo concorrente, • definiamo un oggetto remoto che esporta due metodi• ogni metodo non fa altro che stampare per un certo numero di volte che
è in esecuzione• attiviamo due client: uno invoca il primo metodo, uno il secondo
– si ottiene un interleaving delle stampe ? public interface threads extends java.rmi.Remote { public void MethodOne() throws java.rmi.RemoteException;public void MethodTwo() throws java.rmi.RemoteException;
}
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 45
RMI: INVOCAZIONE CONCORRENTE DI METODI
import java.rmi.*;public class threadsimpl implements threads { public threadsimpl() throws RemoteException {super();} public void MethodOne() throws RemoteException { long TimeOne = System.currentTimeMillis(); for(int index=0;index<25;index++) { System.out.println("Method ONE executing"); // Inserito un ritardo di circa mezzo secondo do{ }while ((TimeOne+500)>System.currentTimeMillis()); TimeOne = System.currentTimeMillis(); } }
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 46
RMI: INVOCAZIONE CONCORRENTE DI METODI
public void MethodTwo() throws RemoteException { long TimeTwo = System.currentTimeMillis(); for(int index=0;index<25;index++) { System.out.println("Method TWO executing"); // Inserito un ritardo di circa mezzo secondo do{ }while ((TimeTwo+500)>System.currentTimeMillis()); TimeTwo = System.currentTimeMillis(); } } }
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 47
RMI: INVOCAZIONE CONCORRENTE DI METODI
import …...public class threadserver { public threadserver() { try {LocateRegistry.createRegistry(args[0]); Registry r=LocateRegistry.getRegistry(args[0]); System.out.println("Registro Reperito"); threadsimpl c = new threadsimpl(); threads stub =(threads) UnicastRemoteObject.exportObject(c, 0); r.rebind("Threads", stub); } catch (Exception e) { System.out.println("Server Error: " + e); } } public static void main(String args[]) { new threadserver(); }}
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 48
RMI: INVOCAZIONE CONCORRENTE DI METODI
public class threadsclient { public static void main(String[] args) { try { Registry r= LocateRegistry.getRegistry(args[0]); threads c = (threads) r.lookup("Threads"); if (args[1].equals("one")) c.MethodOne(); else if (args[1].equals("two")) c.MethodTwo(); else System.out.println("Error: correct usage - treadsclient port {one|two}"); } catch (Exception e){ }}}
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 49
RMI: INVOCAZIONE CONCORRENTE DI METODI
Una possibile traccia di esecuzione
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 50
RMI: INVOCAZIONE CONCORRENTE DI METODI
Dalla documentazione ufficiale“A method dispatched by the RMI runtime to a remote object implementation (a server) may or may not execute in a separate thread. Calls originating from different clients Virtual Machines will execute in different threads. From the same client machine it is not guaranteed that each method will run in a separate thread”
• Invocazioni di metodi remoti provenienti da client diversi sono eseguite da diversi thread
– consente di non bloccare un client in attesa della terminazione dell'esecuzione di un metodo invocato da un altro client
– ottimizza la performance del servizio remoto
• Invocazioni concorrenti provenienti dallo stesso client possono essere eseguite dallo stesso thread o da thread diversi
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 51
RMI: INVOCAZIONE CONCORRENTE DI METODI
• Supporto RMI utilizza multithreading
• Può comportare comportamenti non thread-safe
• Due client diversi possono aggiornare concorrentemente una struttura dati condivisa, producendo risultati errati
– perdita di aggiornamenti
• occorre assicurare il corretto accesso alla struttura dati condivisa
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 52
CONDIVISIONE OGGETTO REMOTO
import java.rmi.Remote;import java.rmi.RemoteException;
public interface Fib extends Remote {
int getNextFib() throws RemoteException;
}
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 53
CONDIVISIONE OGGETTO REMOTO
import java.rmi.*; import java.rmi.registry.LocateRegistry;import java.rmi.registry.Registry; import java.rmi.server.*;public class FibServer implements Fib { private int F1; private int F2; public FibServer() throws RemoteException { F1 = 1; F2 = 2; } public int getNextFib() throws RemoteException { int temp = F1; F1 = F2; F2 = temp + F2; return temp;}
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 54
CONDIVISIONE OGGETTO REMOTO
public static void main (String args[]) { try{LocateRegistry.createRegistry(args[0]); System.out.println("Registro Creato"); Registry r=LocateRegistry.getRegistry(args[0]); System.out.println("Registro Reperito"); FibServer statsServer = new FibServer(); Fib stub =(Fib) UnicastRemoteObject.exportObject(statsServer,0); r.rebind("FIB-SERVER", stub); } catch (RemoteException e) { System.out.println("Communication error " + e.toString());}}}
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 55
CONDIVISIONE OGGETTO REMOTO
import java.rmi.*;import java.rmi.registry.LocateRegistry;import java.rmi.registry.Registry; import java.lang.*;public class FibClient {public static void main (String args[]) { Fib serverObject; Remote RemoteObject; try { Registry r= LocateRegistry.getRegistry(args[0]); RemoteObject = r.lookup("FIB-SERVER"); serverObject = (Fib)RemoteObject; for (int i = 0; i < 10; i++ System.out.println(serverObject.getNextFib()+"\n");} } catch (Exception e) { e.printStackTrace();}}}
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 56
CONDIVISIONE OGGETTO REMOTO
Client1: risultati restituiti1, 2, 3, 5, 8, 13, 21, 34, 55, 89
Client2: risultati restituiti144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946
L'esecuzione di Client2 è iniziata dopo che Client1 è terminato, ma il riferimento all'oggetto remoto è rimasto lo stesso.
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 57
CONDIVISIONE OGGETTO REMOTO
• Il server genera una unica sequenza di numeri di Fibonacci, che viene 'condivisa' dai due client che accedono concorrentemente
• E' stato creato un unico oggetto remoto
• Il supporto può attivare più threads, uno per ogni client, ma ognuno di questi fa riferimento allo stesso oggetto remoto
• Comportamento non corretto per la semantica del servizio
• In generale problemi di sincronizzazione a strutture dati comuni
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 58
SERVIZI DI ESECUZIONE REMOTA
• il meccanismo di RMI consente di implementare strutture più complesse
• si consideri il seguente scenario:– esistono alcuni host sulla rete con capacità computazionali elevate
oppure con hardware specializzato– si vuole realizzare su queste macchine un servizio remoto che consenta
ai client di sottomettere al servizio un task per l'esecuzione, di eseguirlo e di reperirne i risultati
• implementazioni possibile– utilizzare ObjectInput/OutputStream ed il meccanismo della
serializzazione per serializzare oggetti, valori in input, risultati– utilizzare RMI ed implementare un servizio remoto di esecuzione con
un unico metodo che permetta di eseguire i task sottomessi
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 59
COMPUTE ENGINE
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 60
COMPUTE ENGINE: SOLUZIONE 1
import java.io.Serializable;public class somma implements Serializable{ public somma ( ) {super(); }; public int execute(int x) { int somma=0; for (int i=1; i<x; i++) {somma=somma+i;} return somma; }}
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 61
COMPUTE ENGINE: SOLUZIONE 1
import java.net.*; import java.io.*;
public class ServerSocketc {
public static void main (String args[]) throws Exception
{ ServerSocket ss = new ServerSocket(args[0]);
Socket s= ss.accept();
InputStream is=s.getInputStream();
ObjectInputStream ois= new ObjectInputStream(is);
somma som= (somma) ois.readObject();
int par=(int) ois.readObject();
int i=som.execute(par);
OutputStream os= s.getOutputStream();
ObjectOutputStream oos= new ObjectOutputStream(os);
oos.writeObject(i);}}
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 62
COMPUTE ENGINE: SOLUZIONE 1
import java.net.*; import java.io.*;
public class ClientSocket {
public static void main (String args[]) throws Exception
{InetAddress ia= InetAddress.getLocalHost();
Socket s = new Socket(ia, 2330);
somma tasksomma = new somma();
OutputStream os = s.getOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(os);
oo.writeObject(tasksomma);
oo.writeObject(100);
InputStream is = s.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
int i=(int) ois.readObject();
System.out.println(i);}}
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 63
COMPUTE ENGINE: SOLUZIONE 1
• problema principale: il Server offre il servizio di esecuzione per un solo task, il task somma
• come generalizzare il Server in modo che offra un servizio di esecuzione per qualsiasi tipo di task?
• se si conosce l'insieme di Task che possono essere eseguiti dal Server, allora una soluzione è
– inviare un codice che indica il tipo di Task da eseguire– inviare il task– il codice inviato indica al Server quale cast effettuare e quali parametri
di ingresso per l'esecuzione del task sono spediti sullo stream.
• Soluzione alternativa utilizza RMI + Generics
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 64
COMPUTE ENGINE: INTERFACCE REMOTE
import java.rmi.Remote;import java.rmi.RemoteException;public interface Compute extends Remote { <T,Q> T executeTask(Task <T,Q> t, Q q) throws
RemoteException;public interface Task<T,Q> { T execute(Q q); } }• l'unico metodo definito nella interfaccia è executeTask • è un metodo che deve eseguire un task qualsiasi passato dal client
– esempi di task: somma dei primi n numeri interi, calcolo della approssimazione di π
– non si conosce al momento della definizione del servizio remoto ne il tipo dei parametri del task da eseguire ne il tipo del risultato
– utilizzo delle variabili di tipo, generic– Q tipo dell'input, T tipo del risultato
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 65
IL SERVIZIO REMOTO
import java.rmi.RemoteException;import java.rmi.registry.LocateRegistry;import java.rmi.registry.Registry;import java.rmi.server.UnicastRemoteObject;public class ComputeEngine implements Compute {
public ComputeEngine() throws Exception { super(); }
public <T,Q> T executeTask(Task<T,Q> t, Q q) { return t.execute(q); }
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 66
IL SERVIZIO REMOTO
public static void main(String[] args) {
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager()); }
try { String name = "Compute";
Compute engine = new ComputeEngine();
Compute stub =
(Compute) UnicastRemoteObject.exportObject(engine, 0);
System.out.println(stub);
LocateRegistry.createRegistry(args[0]);
Registry registry = LocateRegistry.getRegistry(args[0]);
registry.rebind(name, stub);
System.out.println("ComputeEngine bound");
} catch (Exception e) {
System.err.println("ComputeEngine exception:");
e.printStackTrace();}}}
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 67
L'IMPLEMENTAZIONE DEL TASK
import java.io.Serializable;public class somma implements Task<Integer,Integer>,Serializable{ public somma ( ) {super(); }; public Integer execute (Integer x) { int somma=0; for (int i=0; i<x; i++) {somma=somma+i;} return new Integer(somma); }}
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 68
IL CLIENTimport java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Client {
public static void main(String args[]) {
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager()); }
try { String name = "Compute";
Registry registry = LocateRegistry.getRegistry(args[0]);
Compute comp = (Compute) registry.lookup(name);
somma task = new somma();
Integer s = comp.executeTask(task,100);
System.out.println(s);
} catch (Exception e) {
System.err.println("ComputePi exception:");
e.printStackTrace(); } } }
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 69
ESERCIZIO
Si progetti un’applicazione Client/Server per la gestione delle registrazioni ad un congresso. L’organizzazione del congresso fornisce agli speaker delle varie sessioni un’interfaccia tramite la quale iscriversi ad una sessione, e la possibilità di visionare i programmi delle varie giornate del congresso, con gli interventi delle varie sessioni. Il Server mantiene i programmi delle 3 giornate del congresso, ciascuno dei quali è memorizzato in una struttura dati come quella mostrata di seguito, in cui ad ogni riga corrisponde una sessione (in tutto 12 per ogni giornata). Per ciascuna sessione vengono memorizzati i nomi degli speaker che si sono registrati (al massimo 5).
Dipartimento di InformaticaUniversità degli Studi di Pisa
Remote Method Invocation Laura Ricci 70
ESERCIZIO
Il client può richiedere operazioni per• registrare uno speaker ad una sessione; • ottenere il programma del congresso; Il client inoltra le richieste al server tramite il meccanismo di RMI. Prevedere, per ogni possibile operazione una gestione di eventuali condizioni anomale (ad esempio la richiesta di registrazione ad una giornata e/o sessione inesistente oppure per la quale sono già stati coperti tutti gli spazi d’intervento). Il client è implementato come un processo ciclico che continua a fare richieste sincrone fino ad esaurire tutte le esigenze utente. Stabilire una opportuna condizione di terminazione del processo di richiesta.