java rmi Áttekintés - iitusers.iit.uni-miskolc.hu/ficsor/webalksegedletek/javarmi.pdfrpc -egy...
TRANSCRIPT
FicsorLajos
javarmi / 1
Java RMIJava RMIÁÁttekintttekintééssFicsor Lajos
Miskolci EgyetemÁltalános Informatikai Tanszék
Utolsó módosítás: 2008. 03. 05.
FicsorLajos
Java RMI (Áttekintés) javarmi / 2
A A Java RMIJava RMIRPC - egy távoli eljárás hívása helyi hívásnak tűnikRMI - hasonló mechanizmust biztosít, de objektum orientált módon: egy távoli objektummetódusának hívása helyi objektum használatának tűnikA Java nyelvnek nincs speciális IDL-je, ehelyett minden remote interface ajava.rmi.Remoteinterface-t terjeszti ki
FicsorLajos
Java RMI (Áttekintés) javarmi / 3
A A Java RMI Java RMI architearchitektktúúrráájaja
Client Server
Stubs SkeletonsRemote Reference Layer
Transport Layer
Alkalmazás
FicsorLajos
Java RMI (Áttekintés) javarmi / 4
AzAz RMI RMI architearchitektktúúrara elemeielemeiStubs 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.
FicsorLajos
Java RMI (Áttekintés) javarmi / 5
AzAz RMI RMI architearchitektktúúrara elemei (folyt.)elemei (folyt.)SkeletonTartalmaz 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 argumentumokatmeghívja az aktuális távoli objektum implementációjátátalakítja (marshals) a visszatérési értéket vagy a
kivételt
FicsorLajos
Java RMI (Áttekintés) javarmi / 6
AzAz RMI RMI architearchitektktúúrara elemei (folyt.)elemei (folyt.)Remote reference layerA 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 invocationinvocation to replicated object groups
support for a specific replication strategysupport for a persistent reference to the remote object (enabling activation of the remote objectum)reconnection strategies
FicsorLajos
Java RMI (Áttekintés) javarmi / 7
AzAz RMI RMI architearchitektktúúrara elemei (folyt.)elemei (folyt.)Transport layer
A távoli címtartománnyal való kapcsolat létrehozásaA kapcsolat menedzseléseA kapcsolat "élő" voltának figyelése A bejövő hívások figyeléseAz címtartományhoz tartozó távoli objektumok táblázatának karbantartása Kapcsolat létrehozása egy bejövő híváshozA távoli hívás céljának megfelelő elosztó (dispatcher) megkeresése és a kapcsolat átadása a dispatcher-nek.
FicsorLajos
Java RMI (Áttekintés) javarmi / 8
AzAz RMIRMI egyegyééb jellemzb jellemzőőiiFonál használat az RMI-benA szerver külön szálban, vagy azonos szálban is futhatSzemétgyűjtő mechanizmus a távoli objektumokra isDinamikus osztálybetöltés
Remote objektumok és interface-eik osztályáraStub és skeleton osztályokraEgyéb, az RMI által használt osztályokra (paraméterek, visszatérési értékek)
FicsorLajos
Java RMI (Áttekintés) javarmi / 9
RMI RMI klienskliens éés szerver fejleszts szerver fejlesztééseseInterface
implementálása(.java)
javac
rmicSzerver osztály(.class)
Szerver skeleton(.class)
RMI registry indítása
Szerver objektum aktivizálása
Távoli objektum regisztrálása
Kliensimplementálása(.java)
javac
Kliens indítása
User feladataGenerált elem
Program feladata
Manuális tev.
Jelölés
User
uses
9
84
3a
3
2
7
1 Remoteinterface
definiálása
Kliens stub(.class)Kliens alk.
(.class) 5
6: csak 1.4-ig!
FicsorLajos
Java RMI (Áttekintés) javarmi / 10
A A fejlesztfejlesztéés ls lééppééseisei1. 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 kiterjesztenieMinden metódusának dobnia kell a java.rmi.RemoteException kivételt.
FicsorLajos
Java RMI (Áttekintés) javarmi / 11
A A fejlesztfejlesztéés ls lééppéései (folyt.)sei (folyt.)2. A távoli interface implementálása
Az előbbi interface-t kell implementálnia1.5 előtti verziók esetén a java.rmi.UnicastRemoteObject osztály leszármazottja kell legyenAz 5. verziótól kezdve ez nem szükségesA szerver osztályt példányosítani kell egy mainmetódusban. Ez lehet ugyanabban az osztályban, vagy egy másikban.A szerver objektumot exportálni kell (leszármazott esetén nem kell.)
FicsorLajos
Java RMI (Áttekintés) javarmi / 12
A A fejlesztfejlesztéés ls lééppéései (folyt.)sei (folyt.)3. A szerver osztály lefordítása3a. A stub compiler futtatása (csak 5. előtti
verziók esetén!)A neve rmic, paraméterei azonosak a javac-velGenerálja a kliens stub-ot és a szerver skeletont.Az 5. verziótól kezdve nem szükséges.
FicsorLajos
Java RMI (Áttekintés) javarmi / 13
A A fejlesztfejlesztéés ls lééppéései (folyt.)sei (folyt.)4. RMI registry indítása
rmiregistry parancs a szerver gépenLehetővé teszi a távoli objektum név szerinti elérésétEz is távoli objektumként van implementálvaMinden szerver processz használhat saját registry-tvagy egy közösetA registry kezdetben üres, a távoli objektumokat a szerver processz(ek)nek kell bejegyeznie
FicsorLajos
Java RMI (Áttekintés) javarmi / 14
A A fejlesztfejlesztéés ls lééppéései (folyt.)sei (folyt.)5. Szerver processz indítása
A szerver processz létrehozza a szerver objektum példányát vagy példányait
6. Távoli objektumok regisztrációjaA szerver processz bejegyzi a távoli objektumokat a registry-beEhhez a java.rmi.Naming osztály metódusait használhatjaA szerver ezzel kész fogadni a kliensek kapcsolódását
FicsorLajos
Java RMI (Áttekintés) javarmi / 15
A A fejlesztfejlesztéés ls lééppéései (folyt.)sei (folyt.)7. Kliens kód megírása
A távoli objektum megkereséséhez használnia kell a java.rmi.Naming osztály metódusaitA távoli objektum használata ezután ugyanolyan, mint a lokális objektumoké
8 Kliens kód lefordítása
9. Kliens indítása
FicsorLajos
Java RMI (Áttekintés) javarmi / 16
RMI RMI interfaceinterface--ekek éés oszts osztáályoklyokRMI-vel kapcsolatos csomagok (több, mint 25 osztály és interface):java.rmijava.rmi.serverjava.rmi.dgcjava.rmi.registry
Három funkcionális kategória:RMI alapokRMI securityRMI marshalling
FicsorLajos
Java RMI (Áttekintés) javarmi / 17
RMI alap osztRMI alap osztáályok lyok éés s interfaceinterface--ekekObject osztály(from java.lang)
IOExcept ion osztály(from Java.io)
Remote
(from java.rmi)RemoteObject
RemoteObject()equals()toString()
(from java.rmi.server)
RemoteStub
RemoteStub()setRef()
(f ro m j ava .rmi.se rver)RemoteServer
RemoteServer()getClientHost()getLog()setLog()
(from java.rmi.server)
UnicastRemoteObject
UnicastRemoteObject()exportObject()clone()
(from ja va.rmi.serve r)
RemoteExcept ion
RemoteException()getMessage()
(from java.rmi)
Kliens osztály Szerver osztály
<<uses>>
<<implements>>
FicsorLajos
Java RMI (Áttekintés) javarmi / 18
RMI alap osztRMI alap osztáályok feladatalyok feladataRemote interface
Nincs egyetlen metódusa sem. Csak jelző.Minden remote objektumnak implementálnia kell
RemoteObject osztályA Java Object osztály szerepét tölti be a távoli objektumokra
RemoteStub osztályA kliens objektum(ok) közvetlen ősosztályaElrejti a szerver objektummal való kapcsolatot az őt használóobjektumok elől.
FicsorLajos
Java RMI (Áttekintés) javarmi / 19
RMI alap osztRMI alap osztáályok feladata (folyt.)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ályA 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óraAz 1.5-nál régebbi verziók esetén a szerver osztály ősosztálya kell legyen
FicsorLajos
Java RMI (Áttekintés) javarmi / 20
RMI alap osztRMI alap osztáályok feladata (folyt.)lyok feladata (folyt.)RemoteException osztály
Az RMI által kiváltható valamennyi kivétel ősosztályaA remote interface valamennyi metódusánál specifikálni kell
FicsorLajos
Java RMI (Áttekintés) javarmi / 21
RMI RMI NamingNaming szolgszolgááltatltatááss
Registry
lookup()bind()
unbind()
(from java.rmi.registry)
Remote
(from java.rmi)
LocateRegistry
getRegistry()createRegistry()
(from java.rmi.registry)Naming
lookup()bind()unbind()rebind()list()
(from java.rmi.registry)
Object osztály(from java.lang)
rebind()
FicsorLajos
Java RMI (Áttekintés) javarmi / 22
A A namingnaming szolgszolgááltatltatáás haszns hasznáálatalataTöbbnyire csak a Naming osztályt használjuk.Azonosítás URL formátumú:
rmi://host:port/objektumnevDefault 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)
FicsorLajos
Java RMI (Áttekintés) javarmi / 23
Az RMI forgatAz RMI forgatóókköönyvenyve
Proxyszerver
2. rebind3. setSecurityManager
4. lookup
download
5. metódus hívás metódus hívás
Kliens oldal Szerver oldalKliens System Naming System Szerver
1. setSecurityManager
FicsorLajos
Java RMI (Áttekintés) javarmi / 24
Az RMI forgatAz RMI forgatóókköönyve (folyt.)nyve (folyt.)1. A szerver engedélyezi az RMI Security Manager
működését: létrehoz egy új RMISecurityManager objektumot és átadja a System objektumnak
2. A szerver regisztrálja magát a névszolgáltatónál3. A kliens is engedélyezi az RMI Security
Managert a saját rendszerében
FicsorLajos
Java RMI (Áttekintés) javarmi / 25
Az RMI forgatAz RMI forgatóókköönyve (folyt.)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étA metódus visszad egy referenciát a proxy szerverreHa szükséges, a kliens oldali stub letöltődik
5. A kliens meghívja a távoli objektum metódusátA hívás a proxy szerver objektumhoz fut beA proxy szerver továbbítja a hívást a stub segítségévelA hívás eredménye visszaérkezik szintén a stubsegítségével
FicsorLajos
Java RMI (Áttekintés) javarmi / 26
EgyszerEgyszerűű ppééldaldaEbben 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.
FicsorLajos
Java RMI (Áttekintés) javarmi / 27
PPéélda: tlda: táávoli voli interfaceinterfaceA távoli objektum interface-e:
public interface CountRMI extendsjava.rmi.Remote
{publicint sum() throws java.rmi.RemoteException;publicvoid sum(int val) throwsjava.rmi.RemoteException;publicint increment() throwsjava.rmi.RemoteException;
}
FicsorLajos
Java RMI (Áttekintés) javarmi / 28
PPéélda: kliens programlda: kliens programimport java.rmi.*;import java.rmi.registry.*;import java.rmi.server.*;
public class CountRMIClient{ public static void main(String args[]){ // Security manager beállításaSystem.setSecurityManager(newRMISecurityManager());
FicsorLajos
Java RMI (Áttekintés) javarmi / 29
PPéélda: kliens program (folyt.)lda: kliens program (folyt.)// Referencia szerzese a tavoli objektumratry{ CountRMI myCount = (CountRMI)Naming.lookup("rmi://" + args[0] + "/" + "myCountRMI");
// Megjegyzesek:// a fenti castolas szukseges es lehetseges// innentol kezdve a myCount ugyanugy// hasznalhato, mint egy helyi referencia// szamlalo nullazasaSystem.out.println("Setting Sum to 0");myCount.sum(0); // Mint egy helyi hivas
FicsorLajos
Java RMI (Áttekintés) javarmi / 30
PPéélda: kliens program (folyt.)lda: kliens program (folyt.)// Incrementalas 1000-szerSystem.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);}
}
FicsorLajos
Java RMI (Áttekintés) javarmi / 31
SSzerverzerver objektumobjektum implementimplementáácicióójajaimport java.rmi.*;import java.rmi.server.UnicastRemoteObject;
public class CountRMIImpl//csak 1.5 előtt! extends UnicastRemoteObject
implements CountRMI{// Adattagprivate int sum;
FicsorLajos
Java RMI (Áttekintés) javarmi / 32
SSzerverzerver objektumobjektum implimpl. . (folyt.)(folyt.)public CountRMIImpl(){
}
FicsorLajos
Java RMI (Áttekintés) javarmi / 33
SSzerverzerver objektumobjektum implimpl. . (folyt.)(folyt.)// Tavolrol is elerheto metodusokpublic int sum() throws RemoteException{ return sum; }
public void sum(int val) throwsRemoteException{ sum = val; }
public int increment() throwsRemoteException{ sum++; return sum; }
}
FicsorLajos
Java RMI (Áttekintés) javarmi / 34
SSzerverzerver objektumobjektum inicializinicializáálláásasaimport java.rmi.*;import java.rmi.registry.*;import java.rmi.server.*;public class CountRMIServer{
public static void main(String args[]){// Security manager letrehozasa es inditasaSystem.setSecurityManager(new
RMISecurityManager());
FicsorLajos
Java RMI (Áttekintés) javarmi / 35
SSzerverzerver objektumobjektum inicializinicializáálláásasa (folyt.)(folyt.)try{// CountRMIImpl peldany letrehozasaCountRMIImpl myCount = new CountRMIImpl();// myCount exportalasaCountRMI stub = (CountRMI)
UnicastRemoteObject.exportObject(myCount, 0);// Bejegyzés a registry-beRegistry registry =
LocateRegistry.getRegistry();registry.bind("myCountRMI", myCount);
FicsorLajos
Java RMI (Áttekintés) javarmi / 36
SSzerverzerver objektumobjektum inicializinicializáálláásasa (folyt.)(folyt.)System.out.println("CountRMI Server ready.");} catch (Exception e){ System.out.println("Exception: " +
e.getMessage());e.printStackTrace();
}}
}
FicsorLajos
Java RMI (Áttekintés) javarmi / 37
A pA pééldalda futtatfuttatáásasaLefordítjuk az összes modult (feltételezve, hogy a java file-ok katalógusában vagyunk)javac –cp . CountRMI.javajavac –cp . CountRMIClient.javajavac –cp . CountRMIImpl.javajavac –cp . CountRMIServer.java
(5. előtti verziónál: Futatjuk a stub compilertrmic CountRMIImpl)
Elindítjuk az RMI registry-trmiregistry
Elindítjuk a szervert majd a klienst
FicsorLajos
Java RMI (Áttekintés) javarmi / 38
HivatkozHivatkozáásoksokCsizmazia Balázs: Hálózati alkalmazások készítése (második kiadás), 6. fejezetKiadó: Kalibán Bt., Budapest. 1998ISBN 963 03 5113 7Sok szerző: JAVA 2 útikalauz programozóknak. (Hatodik kiadás) 21. FejezetKiadó: ELTE TTK Hallgatói AlapítványBudapest, 2000ISBN 963 463 364 1
FicsorLajos
Java RMI (Áttekintés) javarmi / 39
HivatkozHivatkozáások (folyt.)sok (folyt.)Robert Orfali, Dan Harkey: Client/SserverProgramming with JAVA and CORBA (Second Edition) Chapter 13.John Wiley & Sons, 1998ISBN 0 471 24578 Xjava.sun.com: RMI tutorial