Remote Method Invocation
In informatica, e in particolare nel contesto del linguaggio di programmazione object-oriented Java, Remote Method Invocation (invocazione remota di metodi) o RMI è una tecnologia che consente a processi Java distribuiti di comunicare attraverso una rete.

Descrizione
[modifica | modifica wikitesto]Questa tecnologia include una API (application programming interface) il cui scopo esplicito è quello di rendere trasparenti al programmatore quasi tutti i dettagli della comunicazione su rete. Essa consente infatti di invocare un metodo di un oggetto remoto (cioè appartenente a un diverso processo, potenzialmente su una diversa macchina) quasi come se tale oggetto fosse "locale" (ovvero appartenente allo stesso processo in cui viene eseguita l'invocazione). In questo senso, la tecnologia Remote Method Invocation può essere ricondotta, da un punto di vista concettuale, all'idea di chiamata di procedura remota (RPC) riformulata per il paradigma object-oriented (in cui, appunto, le procedure sono sostituite da metodi).[1]
L'utilizzo di un meccanismo di invocazione remota di metodi in un sistema object-oriented comporta notevoli vantaggi di omogeneità e simmetria nel progetto, poiché consente di modellare le interazioni fra processi distribuiti usando lo stesso strumento concettuale che si utilizza per rappresentare le interazioni fra i diversi oggetti di una applicazione, ovvero la chiamata di metodo. Per contro, meccanismi di comunicazione fra processi remoti più primitivi (come lo scambio messaggi) rappresentano una forma di interazione "estranea" al paradigma object-oriented.
Il termine Remote Method Invocation identifica ufficialmente sia la Application Programming Interface messa a disposizione del programmatore sia il protocollo di rete usato "dietro le quinte" per il dialogo fra le macchine virtuali Java coinvolte nella comunicazione. Dell'Application programming interface e del protocollo esistono due implementazioni di uso comune. La prima (meno recente) ha nome JRMP (Java Remote Method Protocol) ed è implementata sul protocollo TCP; la seconda, nota come RMI-IIOP, è invece basata sul protocollo IIOP della piattaforma middleware CORBA.[1]
Componente fondamentale è il registro Remote Method Invocation, che si occupa di registrare i server remoti e fornire le referenze remote ai richiedenti che effettuano una lookup su questo.
Esempi
[modifica | modifica wikitesto]Le seguenti classi implementano un semplice programma client-server utilizzando RMI che visualizza un messaggio.
RmiServerIntfinterface
Definisce l'interfaccia utilizzata dal client e implementata dal server. Questa estensione dell'interfaccia java.rmi.Remoteserve a identificare una classe di implementazione come una classe con metodi richiamabili da remoto.
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface RmiServerIntf extends Remote {
String getMessage() throws RemoteException;
}
RmiServerclass
ascolta le richieste RMI e implementa l'interfaccia utilizzata dal client per richiamare metodi remoti.[2]
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.registry.*;
public class RmiServer extends UnicastRemoteObject implements RmiServerIntf {
public static final String MESSAGE = "Hello World";
public RmiServer() throws RemoteException {
super(0); // required to avoid the 'rmic' step, see below
}
public String getMessage() {
return MESSAGE;
}
public static void main(String[] args) throws Exception {
System.out.println("RMI server started");
try { //special exception handler for registry creation
LocateRegistry.createRegistry(1099);
System.out.println("java RMI registry created.");
} catch (RemoteException e) {
//do nothing, error means registry already exists
System.out.println("java RMI registry already exists.");
}
//Instantiate RmiServer
RmiServer server = new RmiServer();
// Bind this object instance to the name "RmiServer"
Naming.rebind("//localhost/RmiServer", server);
System.out.println("PeerServer bound in registry");
}
}
RmiClientclass
ottiene il riferimento (un proxy) all'oggetto remoto presente sul server e invoca il suo metodo per ottenere un messaggio. Se l'oggetto server implementasse java.io.Serializable invece di java.rmi.Remote, verrebbe serializzato e passato al client come valore.[2]
import java.rmi.Naming;
public class RmiClient {
public static void main(String[] args) throws Exception {
RmiServerIntf server = (RmiServerIntf)Naming.lookup("//localhost/RmiServer");
System.out.println(server.getMessage());
}
}
Per eseguire questo esempio, bisogna prima creare un file 'stub' per l'interfaccia utilizzata. Per questo compito utilizziamo il compilatore RMI 'rmic'.[3]
rmic RmiServer
Dalla versione 5.0 di J2SE è stato aggiunto il supporto per i file stub generati dinamicamente e rmic è fornito solo per compatibilità con i runtime precedenti[2] o per i programmi che non forniscono un numero di porta esplicito (o zero) durante l'esportazione di oggetti remoti, che è necessario per la generazione di stub, come descritto nella Javadoc per UnicastRemoteObject.[4]
Note
[modifica | modifica wikitesto]- 1 2 (EN) Java Development Kit Version 24 API Specification, su docs.oracle.com. URL consultato il 14 gennaio 2026.
- 1 2 3 Java RMI Release Notes, su docs.oracle.com. URL consultato il 14 gennaio 2026.
- ↑ Nota: creare un file stub dal file '*.class' con l'implementazione dell'interfaccia remota, non dal file '*.java'.
- ↑ (EN) Java Development Kit Version 24 API Specification, su docs.oracle.com. URL consultato il 14 gennaio 2026.
Bibliografia
[modifica | modifica wikitesto]- (EN) Ann Wollrath, Roger Riggs e Jim Waldo, A Distributed Object Model for the Java System (PDF), Toronto, Sun Microsystems, Inc., 1996. URL consultato il 14 gennaio 2025.
Voci correlate
[modifica | modifica wikitesto]- Enterprise JavaBeans, la più diffusa piattaforma per effettuare Remote Method Invocation.
Collegamenti esterni
[modifica | modifica wikitesto]- cajo Un ambiente semplice, potente e free per l'interazione fra macchine virtuali Java
- RMI trasparente, su trmi.sourceforge.net.