Java remote method invocation

A Wikipédiából, a szabad enciklopédiából
Java-RMI egy tipikus implementációs modellje, amely stub-ot és skeleton objektumokat használ. A Java 2 SDK, Standard Edition, v1.2-től már nem szükséges a skeleton használata.

A Java Remote Method Invocation API vagy Java RMI, egy Java programozói interfész, amely a Remote Procedure Call (RPC) objektumorientált megfelelője.

  1. Az eredeti implementáció a Java virtuális gép (JVM) osztály reprezentáló mechanizmusától függ, és így csupán egyik JVM-től a másikhoz történő hívásokat támogat. Ezen Java implementáción alapuló protokoll a Java Remote Method Protocol (JRMP) néven ismeretes.
  2. A későbbiekben a CORBA kidolgozásával lehetővé vált a nem JVM alapú futtatás is.

Az RMI kifejezés használata jelentheti csupán a programozási interfészt, de jelentheti egyúttal az API és JRMP kettősét is, amíg az RMI-IIOP jelentése, hogy az RMI a legtöbb funkcionalitást a támogató CORBA implementációra bízza.

Általánosított kód[szerkesztés]

Az eredeti RMI API programozói némileg általánosították a kódot, hogy támogassák a különböző implementációkat. Továbbá, az RMI interfész támogatásának érdekében a CORBA bővült az érték szerinti paraméterátadással. Ettől függetlenül az RMI-IIOP és JRMP implementációk még mindig nem rendelkeznek teljesen azonos interfésszel.

Az RMI funkciói a java.rmi csomagban, míg a legtöbb Sun implementáció a sun.rmi csomagban találhatóak. Fontos megjegyezni, hogy a Java 5.0 előtti verziókkal fejlesztőknek egy további fordítási lépésként a rmic parancsot is használniuk kell. Erre az 5.0 illetve ez feletti verziók esetén nincs szükség.

Jini verzió[szerkesztés]

A Jini egy sokkal korszerűbb verzióját szolgáltatja a Java RMI-nek. A működése ugyanaz, ellenben fejlettebb keresési képességeket és elosztott objektum alkalmazási mechanizmusokat nyújt.[1]

Példa[szerkesztés]

Az alábbi osztályok egy egyszerű RMI-t használó kliens-szerver programot implementálnak, ami megjelenít egy üzenetet.

RmiServer class—RMI kérésekre vár és implementálja az interfészt, amit a kliens a távoli metódusok hívására használ.

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
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 {
    }

    public String getMessage() {
        return MESSAGE;
    }

    public static void main(String args[]) {
        System.out.println("RMI server started");

        // Egy security manager létrehozása és telepítése.
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new RMISecurityManager());
            System.out.println("Security manager installed.");
        } else {
            System.out.println("Security manager already exists.");
        }

        try { //speciális kivétel kezelő registry készítéshez
            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.");
        }
            
        try {
            //RmiServer példányosítása
            RmiServer obj = new RmiServer();

            Naming.rebind("//localhost/RmiServer", obj);

            System.out.println("PeerServer bound in registry");
        } catch (Exception e) {
            System.err.println("RMI server exception:" + e);
            e.printStackTrace();
        }
    }
}

RmiServerIntf class—Azon interfész definiálása, amit a kliens használ és a szerver implementál.

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface RmiServerIntf extends Remote {
    public String getMessage() throws RemoteException;
}

RmiClient class—A kliens, ami megkapja a szerveren lévő távoli objektum referenciáját (proxy) és meghívja a metódusát, hogy megkapja az üzenetet. Ha a szerver objektum implementálta a java.io.Serializable interfészt a java.rmi.Remote helyett, szerializálva lesz, és értékként adódik át a kliensnek.[2]

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;

public class RmiClient { 
    // "obj" a távoli objektum referenciája
    RmiServerIntf obj = null;

    public String getMessage() { 
        try { 
            obj = (RmiServerIntf)Naming.lookup("//localhost/RmiServer");
            return obj.getMessage(); 
        } catch (Exception e) { 
            System.err.println("RmiClient exception: " + e); 
            e.printStackTrace(); 
            
            return e.getMessage();
        } 
    }

    public static void main(String args[]) {
        // Egy security manager létrehozása és telepítése.
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new RMISecurityManager());
        }
        
        RmiClient cli = new RmiClient();

        System.out.println(cli.getMessage());
    }
}

A futtatás előtt készítenünk kell egy 'Stub' fájlt a használt interfészről az 'rmic' parancs segítségével.

  • Megjegyzés: ehhez a *.class fájt használjuk, ne a '*.java'*-t.
rmic RmiServer

A fenti lépésre Java 5.0 verziótól nincs szükség.[3]

server.policy—Ez a fájl a szerveren szükséges a TCP/IP kommunikáció biztosítására.

grant {
    permission java.net.SocketPermission "127.0.0.1:*", "connect,resolve";
    permission java.net.SocketPermission "127.0.0.1:*", "accept";
};

A server.policy fájlt Java RTE D kapcsolójával ajánlott használni, pl.:

java.exe -Djava.security.policy=server.policy RmiServer

client.policy—Ez a fájl a kliens oldalon szükséges az RMI szerverhez való kapcsolódáshoz TCP/IP-vel.

grant {
    permission java.net.SocketPermission "127.0.0.1:*", "connect,resolve";
};

no.policy—Ha mégis probléma merül fel a kapcsolódással, az alábbi fájlt érdemes kipróbálni a kliens vagy szerver oldalon.

grant {
    permission java.security.AllPermission;
};

Jegyzetek[szerkesztés]

  1. Taylor, Ian J. From P2P to Web Services and Grids - Peers in a Client/Server World. Springer, 2005
  2. Archivált másolat. [2013. szeptember 19-i dátummal az eredetiből archiválva]. (Hozzáférés: 2012. május 16.)
  3. Jave RMI Release Notes. Oracle. (Hozzáférés: 2012. május 9.)

Külső hivatkozások[szerkesztés]

Fordítás[szerkesztés]

Ez a szócikk részben vagy egészben a Java remote method invocation című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.