Java RMI - Introduzione
RMI sta per Remote Method Invocation. È un meccanismo che consente a un oggetto che risiede in un sistema (JVM) di accedere / richiamare un oggetto in esecuzione su un'altra JVM.
RMI viene utilizzato per creare applicazioni distribuite; fornisce la comunicazione remota tra i programmi Java. Viene fornito nella confezionejava.rmi.
Architettura di un'applicazione RMI
In un'applicazione RMI, scriviamo due programmi, a server program (risiede sul server) e un file client program (risiede nel cliente).
All'interno del programma server, viene creato un oggetto remoto e il riferimento a tale oggetto viene reso disponibile per il client (utilizzando il registro).
Il programma client richiede gli oggetti remoti sul server e tenta di richiamare i suoi metodi.
Il diagramma seguente mostra l'architettura di un'applicazione RMI.
Parliamo ora dei componenti di questa architettura.
Transport Layer- Questo livello collega il client e il server. Gestisce la connessione esistente e crea anche nuove connessioni.
Stub- Uno stub è una rappresentazione (proxy) dell'oggetto remoto sul client. Risiede nel sistema client; funge da gateway per il programma client.
Skeleton - Questo è l'oggetto che risiede sul lato server. stub comunica con questo scheletro per passare la richiesta all'oggetto remoto.
RRL(Remote Reference Layer) - È il layer che gestisce i riferimenti fatti dal client all'oggetto remoto.
Lavorare su un'applicazione RMI
I seguenti punti riassumono il funzionamento di un'applicazione RMI:
Quando il client effettua una chiamata all'oggetto remoto, viene ricevuta dallo stub che alla fine passa questa richiesta all'RRL.
Quando l'RRL lato client riceve la richiesta, richiama un metodo chiamato invoke() dell'oggetto remoteRef. Passa la richiesta all'RRL sul lato server.
L'RRL sul lato server passa la richiesta allo Skeleton (proxy sul server) che infine richiama l'oggetto richiesto sul server.
Il risultato viene passato di nuovo al client.
Marshalling e Unmarshalling
Ogni volta che un client richiama un metodo che accetta parametri su un oggetto remoto, i parametri vengono raggruppati in un messaggio prima di essere inviati sulla rete. Questi parametri possono essere di tipo primitivo o oggetti. In caso di tipo primitivo, i parametri vengono messi insieme e ad esso viene allegata un'intestazione. Nel caso in cui i parametri siano oggetti, vengono serializzati. Questo processo è noto comemarshalling.
Sul lato server, i parametri compressi vengono disaggregati e quindi viene richiamato il metodo richiesto. Questo processo è noto comeunmarshalling.
Registro RMI
Il registro RMI è uno spazio dei nomi in cui vengono posizionati tutti gli oggetti del server. Ogni volta che il server crea un oggetto, registra questo oggetto con RMIregistry (utilizzandobind() o reBind()metodi). Questi vengono registrati utilizzando un nome univoco noto comebind name.
Per richiamare un oggetto remoto, il client necessita di un riferimento a tale oggetto. A quel punto, il client recupera l'oggetto dal registro utilizzando il suo nome di bind (utilizzandolookup() metodo).
La seguente illustrazione spiega l'intero processo:
Obiettivi di RMI
Di seguito sono riportati gli obiettivi di RMI:
- Per ridurre al minimo la complessità dell'applicazione.
- Per preservare l'indipendenza dai tipi.
- Garbage collection distribuita.
- Ridurre al minimo la differenza tra lavorare con oggetti locali e remoti.