RMI sta per Invocazione metodo remoto. È un meccanismo che consente a un oggetto residente 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. È fornito nel pacchetto java.rmi.
Architettura di un’applicazione RMI
In un’applicazione RMI, scriviamo due programmi, un programma server (risiede sul server) e un programma client (risiede sul client).
-
All’interno del programma server, viene creato un oggetto remoto e il riferimento di tale oggetto viene reso disponibile per il client (utilizzando il registro di sistema).
-
Il programma client richiede gli oggetti remoti sul server e tenta di richiamare i relativi metodi.
Il diagramma seguente mostra l’architettura di un’applicazione RMI.
Discutiamo ora i componenti di questa architettura.
-
Livello di trasporto: questo livello collega il client e il server. Gestisce la connessione esistente e imposta anche nuove connessioni.
-
Stub-Uno stub è una rappresentazione (proxy) dell’oggetto remoto al client. Risiede nel sistema client; agisce come un gateway per il programma client.
-
Scheletro-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 livello che gestisce i riferimenti fatti dal client all’oggetto remoto.
Funzionamento di un’applicazione RMI
I seguenti punti riassumono il funzionamento di un’applicazione RMI−
-
Quando il client effettua una chiamata all’oggetto remoto, viene ricevuto 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 Scheletro (proxy sul server) che invoca infine l’oggetto richiesto sul server.
-
Il risultato viene passato fino al cliente.
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 in 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 come marshalling.
Sul lato server, i parametri imballati vengono disaggregati e quindi viene richiamato il metodo richiesto. Questo processo è noto come unmarshalling.
Registro RMI
Registro RMI è uno spazio dei nomi in cui sono posizionati tutti gli oggetti server. Ogni volta che il server crea un oggetto, lo registra con i metodi RMIregistry (bind() o reBind ()). Questi sono registrati utilizzando un nome univoco noto come nome bind.
Per richiamare un oggetto remoto, il client ha bisogno di un riferimento di tale oggetto. A quel tempo, il client recupera l’oggetto dal registro di sistema utilizzando il suo nome bind (utilizzando il metodo lookup ()).
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 la sicurezza del tipo.
- Raccolta dei rifiuti distribuita.
- Ridurre al minimo la differenza tra l’utilizzo di oggetti locali e remoti.