Java RMI Áttekintés Miskolci Egyetem Általános Informatikai Tanszék RMI /1 A Java RMI RPC - egy távoli eljárás hívása helyi hívásnak tÿnik RMI - hasonló mechanizmust biztosít, de objektum orientált módon: egy távoli objektum metódusának hívása helyi objektum használatának tÿnik A Java nyelvnek nincs speciális IDL-je, ehelyett minden remote interface a java.rmi.remote interface-t terjeszti ki Java RMI (Áttekintés) RMI /2 A Java RMI architektúrája Alkalmazás Client Server Stubs Skeletons Remote Reference Layer Transport Layer Java RMI (Áttekintés) RMI /3 Miskolci Egyetem 1
Az RMI architektúra elemei Stubs A kliens hivatkozása a távoli objektumra valójában hivatkozás a helyi csonkra. A csonk meghívja a Remote Reference Layer-t átalakítja (marshals) az argumentumokat értesíti a Remote Reference Layer-t hogy a hívás továbbítható visszaalakítja (unmarshals) a visszatérési értéket vagy a kivételt értesíti a Remote Reference Layer-t, hogy a hívás befejez dött. Java RMI (Áttekintés) RMI /4 Az RMI architektúra elemei (folyt.) Skeleton Tartalmaz egy metódust, amely továbbítja a hívásokat az aktuális távoli objektumok implementációjának: visszaalakítja (unmarshals) az argumentumokat meghívja az aktuális távoli objektum implementációját átalakítja (marshals) a visszatérési értéket vagy a kivételt Java RMI (Áttekintés) RMI /5 Az RMI architektúra elemei (folyt.) Remote reference layer A specifikus távoli hivatkozás protokoll végrehajtásáért felel s. Minden távoli objektum saját távoli hivatkozás osztályt választ, amely a kéréseit végrehajtja. Számos hívási protokoll választható ebben a rétegben. Például: unicast point-to-point invocation invocation to replicated object groups support for a specific replication strategy support for a persistent reference to the remote object (enabling activation of the remote objectum) reconnection strategies Java RMI (Áttekintés) RMI /6 Miskolci Egyetem 2
Az RMI architektúra elemei (folyt.) Transport layer A távoli címtartománnyal való kapcsolat létrehozása A kapcsolat menedzselése A kapcsolat "él " voltának figyelése Abejöv hívások figyelése Az címtartományhoz tartozó távoli objektumok táblázatának karbantartása Kapcsolat létrehozása egy bejöv híváshoz A távoli hívás céljának megfelel elosztó (dispatcher) megkeresése és a kapcsolat átadása a dispatcher-nek. Java RMI (Áttekintés) RMI /7 Az RMI egyéb jellemzÿi Fonál használat az RMI-ben A szerver külön szálban, vagy azonos szálban is futhat Szemétgyÿjt mechanizmus a távoli objektumokra is Dinamikus osztálybetöltés Remote objektumok és interface-eik osztályára Stub és skeleton osztályokra Egyéb, az RMI által használt osztályokra (paraméterek, visszatérési értékek) Java RMI (Áttekintés) RMI /8 RMI kliens és szerver fejlesztése 8 Kliens implementálása (.java) 9 javac 1 Kliens alk. (.class) 10 Kliens indítása Remote interface definiálása uses 2 Interface implementálása (.java) 3 javac User 4 rmic Kliens stub (.class) User feladata Generált elem Program feladata Manuális tev. Jelölés Szerver osztály (.class) Szerver skeleton (.class) 5 RMI registry indítása 6 Szerver objektum aktivizálása 7 Távoli objektum regisztrálása Java RMI (Áttekintés) RMI /9 Miskolci Egyetem 3
A fejlesztés lépései 1. A távoli interface definiálása A távoli objektum interface-ének definiálása Java interface-ként A java.rmi.remote interface-t kell kiterjesztenie Minden metódusának dobnia kell a java.rmi.remoteexception kivételt Java RMI (Áttekintés) RMI /10 A fejlesztés lépései (folyt.) 2. A távoli interface implementálása A Java server osztály megírása Az el bbi interface-t kell implementálnia A java.rmi.unicastremoteobject osztály leszármazottja kell legyen 3. A szerver osztály lefordítása 4. A stub compiler futtatása Anevermic, paraméterei azonosak a javac-vel Generálja a kliens stub-ot és a szerver skeletont. Java RMI (Áttekintés) RMI /11 A fejlesztés lépései (folyt.) 5. RMI registry indítása rmiregistry parancs a szerver gépen Lehet vé teszi a távoli objektum név szerinti elérését Ez is távoli objektumként van implementálva Minden szerver processz használhat saját registry-t vagy egy közöset A registry kezdetben üres, a távoli objektumokat a szerver processz(ek)nek kell bejegyeznie Java RMI (Áttekintés) RMI /12 Miskolci Egyetem 4
A fejlesztés lépései (folyt.) 6. Szerver processz indítása A szerver processz létrehozza a szerver objektum példányát vagy példányait 7. Távoli objektumok regisztrációja A szerver processz bejegyzi a távoli objektumokat a registry-be Ehhez a java.rmi.naming osztály metódusait használhatja A szerver ezzel kész fogadni a kliensek kapcsolódását Java RMI (Áttekintés) RMI /13 A fejlesztés lépései (folyt.) 8. Kliens kód megírása A távoli objektum megkereséséhez használnia kell a java.rmi.naming osztály metódusait A távoli objektum használata ezután ugyanolyan, mint a lokális objektumoké 9. Kliens kód lefordítása 10. Kliens indítása Java RMI (Áttekintés) RMI /14 RMI interface-ek ek és osztályok RMI-vel kapcsolatos csomagok (több, mint 25 osztály és interface): java.rmi java.rmi.server java.rmi.dgc java.rmi.registry Három funkcionális kategória: RMI alapok RMI security RMI marshalling Java RMI (Áttekintés) RMI /15 Miskolci Egyetem 5
RMI alap osztályok és interface-ek ek Remote Object osztály (from java.lang) IOException osztály (from Java.io) (from java.rmi) <<implements>> RemoteObject (from java.rmi.server) RemoteException RemoteStub (from j ava.rmi.server) RemoteObject() equals() tostring() RemoteServer (from java.rmi.server) (from java.rmi ) RemoteException() getmessage() RemoteStub() setref() <<uses>> RemoteServer() getclienthost() getlog() setlog() UnicastRemoteObject (from java.rmi. server) Kliens osztály Szerver osztály Unicas tremoteobject() exportobject() clone() Java RMI (Áttekintés) RMI /16 RMI alap osztályok feladata Remote interface Nincs egyetlen metódusa sem. Csak jelz. Minden remote objektumnak implementálnia kell RemoteObject osztály A Java Object osztály szerepét tölti be a távoli objektumokra RemoteStub osztály A kliens objektum(ok) közvetlen sosztálya Elrejti a szerver objektummal való kapcsolatot az t használó objektumok el l. Java RMI (Áttekintés) RMI /17 RMI alap osztályok feladata (folyt.) RemoteServer osztály Szerver objektumok létrehozása és exportálása (elérhet vé tétele) A szerver implementációk közös bázisosztálya UnicastRemoteObject osztály A távoli szerver objektum implementációja, az alábbi tulajdonságokkal: Tranziens objektum összeköttetés alapú TCP protokollt használ a kommunikációra A szerver osztály sosztálya kell legyen Java RMI (Áttekintés) RMI /18 Miskolci Egyetem 6
RMI alap osztályok feladata (folyt.) RemoteException osztály Az RMI által kiváltható valamennyi kivétel sosztálya A remote interface valamennyi metódusánál specifikálni kell Java RMI (Áttekintés) RMI /19 RMI Naming szolgáltatás Object osztály (from java.lang) Remote (from java.rmi) Registry (from java.rmi.registry) lookup() bind() unbind() rebind() LocateRegistry (from java.rmi.registry) getregistry() createregistry() Naming (from java.rmi.registry) lookup() bind() unbind() rebind() list() Java RMI (Áttekintés) RMI /20 A naming szolgáltatás használata Többnyire csak a Naming osztályt használjuk. Azonosítás URL formátumú: rmi://host:port/objektumnev Default port: 1099 A kliens a lookup metódust használja a távoli objektum referencia megszerzésére: Remote lookup(string name) A szerver a bind vagy rebind metódust használja a szerver objektum regisztrálására: void bind(string name, Remote obj) Java RMI (Áttekintés) RMI /21 Miskolci Egyetem 7
Az RMI forgatókönyve Kliens oldal Szerver oldal Kliens System Naming System Szerver 1. setsecuritymanager 2. rebind 3. setsecuritymanager 4. lookup Proxy download szerver 5. metódus hívás metódus hívás Java RMI (Áttekintés) RMI /22 Az RMI forgatókönyve (folyt.) 1. A szerver engedélyezi az RMI Security Manager mÿködését: létrehoz egy új RMISecurityManager objetumot és átadja a System objektumnak 2. A szerver regisztrálja magát a névszolgáltatónál 3. A kliens is engedélyezi az RMI Security Managert a saját rendszerében Java RMI (Áttekintés) RMI /23 Az RMI forgatókönyve (folyt.) 4. A kliens megkeresi a távoli objektumot Kiad egy lookup hívást a Naming objektumnak, és megadja a kivánt szerver URL nevét A metódus visszad egy referenciát a proxy szerverre Ha szükséges, a kliens oldali stub letölt dik 5. A kliens meghívja a távoli objektum metódusát A hívás a proxy szerver objektumhoz fut be A proxy szerver továbbítja a hívást a stub segítségével A hívás eredménye visszaérkezik szintén a stub segítségével Java RMI (Áttekintés) RMI /24 Miskolci Egyetem 8
Egyszer példa Ebben a példában a távoli objektum egy számlálóval rendelkezik. A számláló adott értékre beállítható, inkrementálható, lekérdezhet. Egy kliens ezt a távoli objektumot használva nullázza a számlálót, ezerszer inkrementálja, majd lekérdezi az értékét. A szerver helye a kliens program paramétere. Java RMI (Áttekintés) RMI /25 Példa: távoli interface A távoli objektum interface-e: public interface CountRMI extends java.rmi.remote public int sum() throws java.rmi.remoteexception; public void sum(int val) throws java.rmi.remoteexception; public int increment() throws java.rmi.remoteexception; Java RMI (Áttekintés) RMI /26 Példa: kliens program import java.rmi.*; import java.rmi.registry.*; import java.rmi.server.*; public class CountRMIClient public static void main(string args[]) // Security manager beállítása System.setSecurityManager(new RMISecurityManager()); Java RMI (Áttekintés) RMI /27 Miskolci Egyetem 9
Példa: kliens program (folyt.) // Referencia szerzese a tavoli objektumra try CountRMI mycount = (CountRMI)Naming.lookup("rmi://" + args[0] + "/" + "my CountRMI"); // Megjegyzesek: // a fenti castolas szukseges es lehetseges // innentol kezdve a mycount ugyanugy // hasznalhato, mint egy helyi referencia // szamlalo nullazasa System.out.println("Setting Sum to 0"); mycount.sum(0); // Mint egy helyi hivas Java RMI (Áttekintés) RMI /28 Példa: kliens program (folyt.) // Incrementalas 1000-szer System.out.println("Incrementing"); for (int i = 0 ; i < 1000 ; i++ ) mycount.increment(); System.out.println("Sum = " + mycount.sum()); // Kivetel kezelese catch(exception e) System.err.println("System Exception" + e); System.exit(0); Java RMI (Áttekintés) RMI /29 Szerver objektum implementációja import java.rmi.*; import java.rmi.server.unicastremoteobject; public class CountRMIImpl extends UnicastRemoteObject implements CountRMI // Adattag private int sum; Java RMI (Áttekintés) RMI /30 Miskolci Egyetem 10
Szerver objektum impl. (folyt.) public CountRMIImpl(String name) throws RemoteException super(); try // Az objektum regisztralasa Naming.rebind(name, this); sum = 0; catch (Exception e) System.out.println("Exception: "+ e.getmessage()); Java RMI (Áttekintés) RMI /31 Szerver objektum impl. (folyt.) // Tavolrol is elerheto metodusok public int sum() throws RemoteException return sum; public void sum(int val) throws RemoteException sum = val; public int increment() throws RemoteException sum++; return sum; Java RMI (Áttekintés) RMI /32 Szerver objektum inicializálása import java.rmi.*; import java.rmi.server.*; public class CountRMIServer public static void main(string args[]) // Security manager letrehozasa es inditasa System.setSecurityManager(new RMISecurityManager()); Java RMI (Áttekintés) RMI /33 Miskolci Egyetem 11
Szerver objektum inicializálása (folyt.) try // CountRMIImpl peldagny letrehozasa CountRMIImpl mycount = new CountRMIImpl("my CountRMI"); System.out.println("CountRMI Server ready."); catch (Exception e) System.out.println("Exception: " + e.getmessage()); e.printstacktrace(); Java RMI (Áttekintés) RMI /34 Apélda futtatása Lefordítjuk az összes modult (feltételezve, hogy a java file-ok katalógusában vagyunk) javac CountRMI.java javac CountRMIClient.java javac CountRMIImpl.java javac CountRMIServer.java Futatjuk a stub compilert rmic CountRMIImpl Elindítjuk az RMI registry-t rmiregistry Elindítjuk a szervert majd a klienst Java RMI (Áttekintés) RMI /35 Hivatkozások Csizmazia Balázs: Hálózati alkalmazások készítése (második kiadás), 6. fejezet Kiadó: Kalibán Bt., Budapest. 1998 ISBN 963 03 5113 7 Sok szerz : JAVA 2 útikalauz programozóknak. (Hatodik kiadás) 21. Fejezet Kiadó: ELTE TTK Hallgatói Alapítvány Budapest, 2000 ISBN 963 463 364 1 Java RMI (Áttekintés) RMI /36 Miskolci Egyetem 12
Hivatkozások (folyt.) Robert Orfali, Dan Harkey: Client/Sserver Programming with JAVA and CORBA (Second Edition) Chapter 13. John Wiley & Sons, 1998 ISBN 0 471 24578 X Java RMI (Áttekintés) RMI /37 Miskolci Egyetem 13