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.
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. 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 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 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ó 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.Taylor, Ian J. From P2P to Web Services and Grids - Peers in a Client/Server World. Springer, 2005
Példa 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.
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.
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
Külső hivatkozások - Remote Method Invocation Home The Java RMI tutorial - a good starting point to learn RMI. Also check the Hello World in RMI the Java RMI online training - Very good for training JavaRMI and as reference The RMI page in the JDK docs (Sun's Java API Reference for the RMI package)
Programming WebLogic RMI - an introduction to RMI in Oracle Weblogic. General Remote Method Invocation
Fordítás
Kategória:Java