A Java Remote Method InvocationAPI 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 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ó
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
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.
importjava.rmi.Naming;importjava.rmi.RemoteException;importjava.rmi.RMISecurityManager;importjava.rmi.server.UnicastRemoteObject;importjava.rmi.registry.*;publicclassRmiServerextendsUnicastRemoteObjectimplementsRmiServerIntf{publicstaticfinalStringMESSAGE="Hello world";publicRmiServer()throwsRemoteException{}publicStringgetMessage(){returnMESSAGE;}publicstaticvoidmain(Stringargs[]){System.out.println("RMI server started");// Egy security manager létrehozása és telepítése.if(System.getSecurityManager()==null){System.setSecurityManager(newRMISecurityManager());System.out.println("Security manager installed.");}else{System.out.println("Security manager already exists.");}try{//speciális kivétel kezelő registry készítéshezLocateRegistry.createRegistry(1099);System.out.println("java RMI registry created.");}catch(RemoteExceptione){//do nothing, error means registry already existsSystem.out.println("java RMI registry already exists.");}try{//RmiServer példányosításaRmiServerobj=newRmiServer();Naming.rebind("//localhost/RmiServer",obj);System.out.println("PeerServer bound in registry");}catch(Exceptione){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.
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]
importjava.rmi.Naming;importjava.rmi.RemoteException;importjava.rmi.RMISecurityManager;publicclassRmiClient{// "obj" a távoli objektum referenciájaRmiServerIntfobj=null;publicStringgetMessage(){try{obj=(RmiServerIntf)Naming.lookup("//localhost/RmiServer");returnobj.getMessage();}catch(Exceptione){System.err.println("RmiClient exception: "+e);e.printStackTrace();returne.getMessage();}}publicstaticvoidmain(Stringargs[]){// Egy security manager létrehozása és telepítése.if(System.getSecurityManager()==null){System.setSecurityManager(newRMISecurityManager());}RmiClientcli=newRmiClient();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.
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.