Your SlideShare is downloading. ×
Tutorial su Java RMI
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Tutorial su Java RMI

18,005
views

Published on

Tutorial su Java RMI

Tutorial su Java RMI

Published in: Technology

0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
18,005
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
651
Comments
0
Likes
5
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Java Remote Method Invocation (RMI) RUGGERO RUSSO 1
  • 2. Introduzione Per implementare un sistema distribuito è necessario disporre di un sistema di comunicazione tra macchine diverse basato su standard e protocolli prestabiliti Socket: consentono di realizzare una connessione remota non definiscono le modalità di invocazione di oggetti remoti e i protocolli di comunicazione Remote Procedure Call – RPC (inizi anni 80) Consentono l’esecuzione di codice (procedure) remoto rispetto al chiamante RUGGERO RUSSO 2
  • 3. RPC Introducono le nozioni di: Client: programma che chiama una procedura remota Server: programma che implementa la chiamata di procedura remota invocata Interface Definition Language IDL: linguaggio di definizione delle interfacce con cui il server espone i metodi invocabili remotamente. Fornisce una rappresentazione astratta della procedura in termini di parametri di input/output; può essere considerata come la specifica dei servizi offerti dal client RUGGERO RUSSO 3
  • 4. Vantaggi Miglioramento delle prestazioni complessive Maggiore semplicità nella gestione delle risorse distribuite Maggiore scalabilità del sistema complessivo e.g. è possibile suddividere un processo pesante dal punto di vista computazionale in sottoprocessi che girano su macchine diverse e.g. l’approccio RPC veniva utilizzato per la gestione dei sistemi Legacy, incapsulati all’interno di un wrapper la cui interfaccia consentiva l’invocazione remota di procedure RUGGERO RUSSO 4
  • 5. Sviluppo Applicazione con RPC Obiettivo: sviluppo di un’applicazione utilizzata in remoto da un singolo client Metodologia: Definizione della interfaccia IDL della procedura, è la specifica dei servizi offerti dal server Compilazione dell’interfaccia che produce: Il Client Stub Il Server Stub RUGGERO RUSSO 5
  • 6. Sviluppo Applicazione con RPC (2) RUGGERO RUSSO 6
  • 7. Gli Stub Client Stub Quando un client chiama la procedura remota in realtà fa una chiamata locale ad una procedura dello stub Lo stub: Individua il server Formatta i dati in modo opportuno (operazione di ordinamento e serializzazione) Comunica con il server Ottiene una risposta Inoltra la risposta come parametro di ritorno della procedura invocata dal client RUGGERO RUSSO 7
  • 8. Gli Stub (2) Server Stub Come il client stub ma implementa il lato server dell’invocazione Lo stub: Riceve l’invocazione dal client stub Formatta i dati in modo opportuno (operazione di unmarshalling e deserializzazione) Invoca la reale procedura implementata nel server Inoltra i valori di ritorno dalla procedura al client stub RUGGERO RUSSO 8
  • 9. Sviluppo Applicazione con RPC (3) RUGGERO RUSSO 9
  • 10. RPC a RMI RPC è una tecnologia interamente orientata alla gestione delle procedure RMI viene introdotta per implementare le stesse funzionalità in contesto di programmazione object-oriented Invocazione remota di metodi NON di procedure RUGGERO RUSSO 10
  • 11. RMI RMI è la libreria di Java che consente di interagire con oggetti che girano sulla Java Virtual Machine di host remoti sulla rete java.rmi java.rmi.server Con RMI: è possibile invocare metodi su oggetti che competono a processi remoti come se fossero oggetti locali viceversa è possibile esportare un oggetto come remoto in modo che processi remoti possano avere accesso diretto ad esso senza dover definire un protocollo e un formato di trasmissione delle informazioni 11
  • 12. RMI in sistemi eterogenei RMI si presta molto bene ad essere usato tra sistemi omogenei (full-Java) Per la comunicazione remota tra sistemi eterogenei: Utilizzare RMI facendo wrapping degli oggetti non- Java (utilizzando la Java Native Interface) Utilizzare un altro schema per gestire oggetti distribuiti language-indipendent e.g., CORBA Utilizzare RMI/IIOP che consente agli oggetti RMI di comunicare direttamente con oggetti remoti CORBA su IIOP (Internet inter-ORB protocol) RUGGERO RUSSO 12
  • 13. Architettura RMI RMI CLIENT RMI SERVER STUB SKELETON Connessione virtuale Remote Reference Layer Remote Reference Layer Trasport Layer Trasport Layer Connessione fisica 13
  • 14. Architettura RMI (2) E’ organizzata su tre strati: Stub/skeleton layer: fornisce le interfacce usate da client e server per le loro interazioni Remote reference layer: Fornisce un oggetto RemoteRef che rappresenta il link all’oggetto remoto che realizza il servizio instaura un collegamento virtuale tra i due lati Codifica le richieste del client e le invia al server Decodifica le richieste e le inoltra allo skeleton RUGGERO RUSSO 14
  • 15. Architettura RMI (3) Transport layer: strato sul quale è realizzato il collegamento fisico; si perde la concezione di oggetto remoto/locale. I dati sono sequenze di byte Collegamento di tipo sequenziale. Per questo si richiede la serializzazione dei parametri da passare ai metodi Gestisce: Il protocollo di conversione delle invocazioni remote dei metodi L’impacchettamento dei riferimenti ai vari oggetti RUGGERO RUSSO 15
  • 16. Stub/Skeleton Forniscono una duplice rappresentazione dell’oggetto remoto: Lo stub: rappresenta una simulazione locale sul client dell’oggetto remoto che vive e viene eseguito sul server Lo stub è un proxy per il reale oggetto remoto del server Lo stub fa apparire il metodo come locale Non implementa il metodo ma tutti i meccanismi necessari per consentire al client di interagire con il server, al fine di eseguire il metodo (in modo trasparente) RUGGERO RUSSO 16
  • 17. Stub/Skeleton (2) Lo skeleton: Speculare dello stub lato server Implementa il lato server dell’invocazione, contiene il codice per ricevere e gestire l’invocazione dallo stub del client e invocare l’oggetto corretto residente sul server RUGGERO RUSSO 17
  • 18. Protocollo RMI Il client riceve un riferimento (reference) dell’oggetto remoto (lo stub dell’oggetto) Inizia l’invocazione di un metodo remoto chiamando un metodo su un oggetto stub (esegue i metodi messi a disposizione per l’invocazione remota su un oggetto come se fosse locale) RUGGERO RUSSO 18
  • 19. Protocollo RMI (2) Realizza la serializzazione e marshalling degli argomenti dei metodi passati al server in modo da produrre dati gestibili dal TL e utilizzabili dallo oggetto remoto Chiede al RRL di instradare la richiesta (metodo e argomenti) verso l’oggetto remoto invocato Lato server: il remote reference layer riceve la richiesta dal TL e la converte in una richiesta per lo skeleton del server compatibile con l’oggetto riferito RUGGERO RUSSO 19
  • 20. Protocollo RMI (3) Lo skeleton converte la richiesta remota nella appropriata chiamata ad un metodo sul oggetto reale residente sul server (la conversione consiste nell’unmarshalling degli argomenti della chiamata in un formato adatto alle caratteristiche dell’oggetto che gira sul server se l’esecuzione del metodo richiede la comunicazione indietro con il client, lo skeleton si occupa di serializzare i dati di ritorno e di reinviarli RUGGERO RUSSO 20
  • 21. Servizi RMI RMI fornisce alcuni servizi base per la gestione delle applicazioni distribuite Naming/Registry service Remote Object Activation service Distributed Garbage collection RUGGERO RUSSO 21
  • 22. Naming Registry Service Quando un processo server-side esporta un servizio basato su RMI deve registrare uno o più oggetti RMI con il suo Registry locale (rappresentato da una interfaccia specifica: la Registry Interface) Ciascun oggetto è registrato con il suo nome logico che un client può utilizzare come riferimento La gestione della coppia oggetto remoto/ nome logico è gestita tramite un’interfaccia specifica: la Naming interface e.g.: un client può ottenere un riferimento stub all’oggetto remoto invocando l’oggetto per nome attraverso di essa 22
  • 23. Naming Registry Service(2) Il metodo Naming.lookup() prende il nome dell’oggetto remoto e lo localizza nella rete Quando il metodo lookup() individua l’host dell’oggetto desiderato, consulta il registry RMI dell’host, richiede l’oggetto per nome. Se il registry trova l’oggetto, genera un riferimento remoto all’oggetto e lo fornisce al processo client Il riferimento viene convertito dal processo client in un riferimento stub che è restituito al chiamante Una volta ricevuto il riferimento il client può iniziare la conversazione con il server 23
  • 24. Remote Object Activation Service Il servizio di attivazione di un oggetto remoto: Fornisce un modo per consentire l’attivazione di un oggetto sul server sulla base delle necessità del client che lo invoca Un server object è registrato con un RMI registry service all’interno di una JVM attiva ed è disponibile per il tempo in cui la JVM è in vita, se si ferma non si ha più modo di invocare l’oggetto remoto, i riferimenti diventano inutilizzabili Crea il server object dinamicamente all’interno di un virtual machine esistente o nuova Ottiene un nuovo riferimento all’oggetto creato che verrà passato al client che ne ha richiesto l’attivazione 24
  • 25. Distributed Garbage Collection Meccanismo di garbage collection specifica per RMI Realizza la ripulitura delle aree di memoria non più utilizzate Per ogni oggetto remoto RMI, il server reference layer mantiene la lista di riferimenti remoti registrati dai client, ottenuti esplicitamente tramite lookup() o implicitamente a seguito di una invocazione di metodo remoto 25
  • 26. Distributed Garbage Collection(2) Quando la VM del client si accorge che l’oggetto remoto non è più referenziato localmente, invia una notifica al server RMI Il server aggiorna la lista dei riferimenti Quando un oggetto non è più referenziato da alcun client ne’ da oggetti locali, viene eliminato attraverso un’operazione di garbage collection 26
  • 27. Distributed Garbage Collection (3) Inoltre DGC prevede l’uso di un timeout per l’invocazione di un riferimento remoto Quando il timeout scade il riferimento viene eliminato dalla lista e viene data notifica ai client che avevano quel riferimento Se il client è ancora attivo richiederà al server di mantenere attivo nella lista il riferimento remoto Il meccanismo evita di occupare memoria con riferimenti inutilizzati da client non più esistenti 27
  • 28. Uso di RMI Passo1: definire e creare oggetti remoti: oggetto remoto: implementa l’interfaccia Remote e ha metodi che sono eseguibili da un applicazione client non residente sulla stessa macchina virtuale interfaccia remota: rende disponibili dei metodi utilizzabili per l’invocazione a distanza RUGGERO RUSSO 28
  • 29. Uso di RMI (2) ESEMPIO: definizione dell’oggetto non remoto MyServer public class MyServer { public void String concat(String a, String b) { return a+b; } } Trasformazione dell’oggetto nella sua versione remota: definizione della interfaccia remota corrispondente public inteface MyServerInterface extends Remote { public String concat(String a, String b) Per creare una throws RemoteException; interfaccia remota è } necessario estendere java.rmi.Remote RUGGERO RUSSO 29
  • 30. Uso di RMI (3) Passo 2: Definita l’interfaccia remota si modifica la classe di partenza in modo che implementi l’interfaccia stessa public class MyServerImpl Implements MyServerInterface extends UnicastRemoteObject { public MyServerImpl() throws RemoteException { … } public String concat(String a, String b) throws RemoteException { return a+b; } } RUGGERO RUSSO 30
  • 31. Uso di RMI (3) Nota: il nome della classe è stato modificato in Definita l’interfaccia remota si modifica la classe di partenza in modo che modo che implementi l’interfaccia implementi l’interfaccia stessa Si deve estendere la classe UnicastRemoteObject public class MyServerImpl Implements MyServerInterface extends UnicastRemoteObject { Classe che deriva da RemoteObject (superclasse public MyServerImpl() throws RemoteException { le comune per tutte … implementazioni di oggetti } remoti) e RomoteServer public String concat(String a, String b) ridefinisce equals() per throws RemoteException { consentire il confronto con return a+b; oggetti remoti } } A questo punto l’oggetto è visibile all’esterno ma non ancora utilizzabile da RMI: si creano gli stub e gli skeleton RUGGERO RUSSO 31
  • 32. Uso di RMI (4) Passo 3: Per rendere utilizzabile l’oggetto creato con RMI è necessario compilare opportunamente l’interfaccia per la creazione di STUB e SKELETON Nella JDK esiste un compilatore apposito: rmic Con un’operazione del tipo: rmic MyserverImpl Si ottengono i due file: MyServerImpl_stub.class MyServerImpl_skel.class RUGGERO RUSSO 32
  • 33. Uso di RMI (5) Passo 4: e’ necessario abilitare il collegamento tra client e server per l’invocazione remota Funzione realizzata da Server RMI che è l’applicazione di servizio necessaria per avviare il meccanismo di attivazione remota che instanzia un oggetto remoto e lo registra tramite un bind all’interno del RMI registry RUGGERO RUSSO 33
  • 34. Registry and Naming Services Passo 5: sul lato server lo skeleton notifica di possedere un oggetto abilitato all’invocazione remota tramite il metodo java.rmi.Naming.bind()che associa all’istanza dell’oggetto remoto un nome logico che identifica l’oggetto in rete Si crea un’istanza dell’oggetto remoto MyServerImpl server = new MyServerImpl Naming.bind (“pluto”, server) effettua la registrazione con un nome simbolico 34
  • 35. Registry and Naming Services Passo 6: ogni associazione nome logico – oggetto remoto e’ memorizzato nel RMI registry gestito con l’istruzione rmiregistry. start rmiregistry Il registry creato si mette in ascolto di processi locali che vogliano registrare nuovi oggetti, o di client che si connettono per fare il lookup di oggetti RMI Passo 7: quando viene registrato l’oggetto, il client è in grado di ottenere un reference all’oggetto con una ricerca utilizzando il nome logico RUGGERO RUSSO 35
  • 36. Registry and Naming Services (2) Esempio: MyServerInterface server; String url =“//” + serverhost + “/MyServer”; server = (MyServerInterface)Naming.lookup(url); Lookup identifica il Il metodo list() restituisce la nome della macchina lista di tutti gli oggetti che ospita l’oggetto remoto e il nome con referenziati con il registry cui l’oggetto è locale registrato RUGGERO RUSSO 36
  • 37. Registry and Naming Services (3) Le operazioni di ricerca e registrazione accettano come parametro un URL il cui formato è: rmi://host:port/name host: è il nome del server RMI port: è la porta su cui sta in ascolto il registry (default 1099) name: il nome logico RUGGERO RUSSO 37
  • 38. Argomenti dei metodi remoti e valori di ritorno Gli argomenti vengono passati ai metodi remoti attraverso un processo di serializzazione e deserializzazione In realtà l’oggetto serializzato non viene fisicamente spostato dal client al server Vengono inviate nella rete le info per ricreare una copia dell’oggetto Client e server devono disporre dello stesso bytecode riferito all’oggetto per poterne ricreare l’istanza Si ovvia al problema copiando fisicamente i vari file .class sia sul client che sul server Soluzione scomoda: RMI mette a disposizione un meccanismo di scaricamento dalla rete dei file necessari al client tramite un server HTTP 38
  • 39. ESEMPI 39
  • 40. Esempio HelloWorld HelloServer Interface import java.rmi.Remote; import java.rmi.RemoteException; public interface HelloServer extends remote { String sayHello() throws remoteException; } 40
  • 41. Esempio HelloWorld HelloServer Implementation import java.rmi.*; import java.rmi.server.*; public class HelloServerImpl extends UnicastRemoteObject implements HelloServer { public HelloServerImpl() throws RemoteException { super(); } public String sayHello() throws RemoteException { return quot;Hello World!quot;; } } 41
  • 42. Esempio HelloWorld HelloReg – crea il registry import java.rmi.*; import java.rmi.server.*; public class HelloReg { public static void main(String args[]) { try { HelloServerImpl obj = new HelloServerImpl(); Naming.rebind(quot;helloRussoquot;, obj); System.out.println(quot;HelloServer bound in the RMI Registryquot;); } catch (Exception e) { System.out.println(quot;HelloImpl err: quot; + e.getMessage()); e.printStackTrace();} } } 42
  • 43. Esempio HelloWorld HelloClient implementazione lato client import java.rmi.Naming; import java.rmi.RemoteException; public class HelloClient { public static void main(String[] arg){ try { System.out.println(quot;Getting the remote object reference......quot;); HelloServer obj = (HelloServer) Naming.lookup(quot;rmi://quot; +arg[0]+ quot;/helloRussoquot;); System.out.println(quot;Invoking remote methodquot;); String message = obj.sayHello(); System.out.println(quot;Result: quot;+message); } catch (Exception e){ System.out.println(quot;HelloClient exception: quot; + e.getMessage()); e.printStackTrace(); } } } 43
  • 44. Esempio HelloWorld Passo 1: mando in esecuzione il registry C:...jdk1.5.0_06bin> start rmiregistry Passo2: compilo le classi java C:...corsoPSIIrmiE3RMIExampleServer> javac *.java Passo 3: compiliamo l’implementazione dell’interfaccia C:...corsoPSIIrmiE3RMIExampleServer> rmic HelloServerImpl L’operazione produce lo stub e lo skeleton 44
  • 45. Esempio HelloWorld Passo 4: Compiliamo le classi java del client C:...corsoPSIIrmiE3RMIExampleClient> javac *.java Passo 5: Registriamo il Remote Server Object C:... corsoPSIIrmiE3RMIExampleServer> java HelloReg Passo 6: Copio HelloServerImpl_stub.class nella cartella Client Passo 7: Eseguiamo il Client C:... corsoPSIIrmiE3RMIExampleClient> java HelloClient 10.0.1.57 NOTA: è necessario inserire le directory di lavoro Client e Server nel classpath!!! 45