Vai al contenuto

Remote Method Invocation

Da Wikipedia, l'enciclopedia libera.

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.

Un tipico modello di implementazione di Java-RMI che utilizza oggetti stub e skeleton. Java 2 SDK, Standard Edition, v1.2 ha eliminato la necessità di uno skeleton.

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.

Le seguenti classi implementano un semplice programma client-server utilizzando RMI che visualizza un messaggio.

RmiServerIntf interface

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;
}
RmiServer class

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");
    }
}
RmiClient class

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]

  1. 1 2 (EN) Java Development Kit Version 24 API Specification, su docs.oracle.com. URL consultato il 14 gennaio 2026.
  2. 1 2 3 Java RMI Release Notes, su docs.oracle.com. URL consultato il 14 gennaio 2026.
  3. Nota: creare un file stub dal file '*.class' con l'implementazione dell'interfaccia remota, non dal file '*.java'.
  4. (EN) Java Development Kit Version 24 API Specification, su docs.oracle.com. URL consultato il 14 gennaio 2026.

Voci correlate

[modifica | modifica wikitesto]

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.
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica