Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

RMI = Remote Method Invocation

Hasonló előadás


Az előadások a következő témára: "RMI = Remote Method Invocation"— Előadás másolata:

1 RMI = Remote Method Invocation
Meg tudjuk hívni olyan objektumok metódusait is, amelyek más virtuális gépben futnak Kommunikáció különböző gépeken futó Java programok között Kliens-szerver alkalmazások Elosztott alkalmazások Alternatíva: CORBA Nem csak Java programok/objektumok között © Kozsik Tamás

2 Kliens-szerver forgatókönyv
A szerver program elérhetővé tesz objektumokat bejegyzi őket egy registry-be a távoli objektumok várják, hogy a kliensek meghívják a metódusaikat A kliensek szereznek egy referenciát egy ilyen objektumra aztán hívogatják a távoli objektumok metódusait A részleteket az RMI rendszer elintézi... © Kozsik Tamás

3 Elosztott objektumok rendszere forgatókönyv
Különböző számítógépeken futó különböző virtuális gépekben elhelyezkedő objektumokat bejegyzünk Megkeresik egymást és kommunikálnak egymással hívogatják egymás metódusait Egymás megkeresése: pl. registry-n keresztül A részleteket az RMI rendszer elintézi... © Kozsik Tamás

4 Tevékenységek Távoli objektumok megkeresése rájuk referencia beszerzése rmiregistry-n keresztül metódushívások paramétereként/eredményeként Kommunikáció a távoli objektummal sima metódushívások a programozó számára a részleteket az RMI elfedi Osztálydefiníciós fájlok továbbítása egymásnak átadott objektumok osztályának betöltése egy másik, távoli virtuális gépből © Kozsik Tamás

5 © Kozsik Tamás

6 Dinamikus osztálybetöltés
Amikor a távoli objektumok egymás metódusait hívják... … paramétereket adnak át és visszatérési értékeket kapnak Nem biztos, hogy egy virtuális gép ismeri annak az objektumnak az osztályát, amit így kap Az RMI letölti az osztálydefiníciót is © Kozsik Tamás

7 Távoli objektumok Amelyeknek meg lehet hívni metódusait az RMI segítségével más virtuális gépekből A java.rmi.Remote interfészt megvalósítják Megvalósítanak egy távoli interfészt (a Remote egy kiterjesztését), amiben fel vannak sorolva a távolról elérhető metódusaik © Kozsik Tamás

8 Távoli metódus Kiterjesztjük a java.rmi.Remote interfészt
Ez lesz a „távoli interfész” Ebben vannak definiálva a távolról meghívható metódusok csak ezek hívhatók távolról Ezek a metódusok specifikálják, hogy kiválthatják a java.rmi.RemoteException kivételt © Kozsik Tamás

9 Mi is történik? A kliens egy „távoli referenciával” rendelkezik a távoli objektumra A kliens virtuális gépben egy proxy objektum van, ami úgy csinál, mintha ő lenne a távoli objektum továbbítja a metódushívásokat a távoli objektumnak Ezt a proxy objektumot stub-nak nevezik © Kozsik Tamás

10 Stub - csonk: klienscsonk
A távoli objektum reprezentánsa a klien virtuális gépekben Amikor távoli objektumra referenciát szerzünk a registry-ből, akkor egy ilyen jön létre Amikor távoli objektumokat paraméterként vagy visszatérési értékként átadunk, akkor ilyen adódik át helyette Ugyanazokat a távoli interfészeket valósítja meg, mint amit a távoli objektum Még cast-olni is lehet © Kozsik Tamás

11 Mit is kell akkor tennünk?
Az elosztott objektumrendszer komponenseinek megtervezése és megvalósítása Fordítás, és utána a csonkok legenerálása A fájlok kitevése a hálóra Futtatás © Kozsik Tamás

12 Az elosztott objektumrendszer komponenseinek megtervezése és megvalósítása (4/1)
El kell dönteni, hogy a rendszerben mely komponensek lesznek távolról elérhetők, és melyek lesznek lokálisak © Kozsik Tamás

13 Az elosztott objektumrendszer komponenseinek megtervezése és megvalósítása (4/2)
A távoli interfészek definiálása a távolról elérhető szolgáltatások definiálása A távoli metódusok paramétereiben és visszatérési értékeiben használt típusok (osztályok és interfészek) megírása © Kozsik Tamás

14 Az elosztott objektumrendszer komponenseinek megtervezése és megvalósítása (4/3)
A távoli osztályok elkészítése implementálják a távoli interfészeket megvalósítják a távolról igénybevehető szolgáltatásokat A metódusok paramétereiben és visszatérési értékeiben használt típusok (osztályok és interfészek) megírása © Kozsik Tamás

15 Az elosztott objektumrendszer komponenseinek megtervezése és megvalósítása (4/4)
Kliensek megvalósítása ráér akkor is, ha a távoli objektumok már üzembe vannak helyezve... © Kozsik Tamás

16 Fordítás, és utána a csonkok legenerálása
Forrásfájlok lefordítása javac A .class fájlokból a csonkok legenerálása rmic többek között ez is része a Development Kit-nek © Kozsik Tamás

17 A fájlok kitevése a hálóra
Minden .class fájlt, amit a kliensek használni szeretnének majd, elérhetővé tesszük egy WEB-szerveren keresztül a távoli interfészek a klienscsonkok a segédosztályok és segédinterfészek (paraméterek, visszatérési értékek típusa...) © Kozsik Tamás

18 Futtatás Az rmiregistry program
ez is része a Development Kit-nek A távoli objektumokat bejegyző programok pl. a szerverek A használó programok kliensek © Kozsik Tamás

19 Hogyan is kell akkor ilyet írni?
Készítsünk el egy távoli objektumot, ami tud összegezni egész számokat! Definiáljuk a szolgáltatást: Adder interfész Megvalósítjuk a távoli objektumot: RemoteAdder osztály Írunk egy kliens programot, ami használja © Kozsik Tamás

20 Adder interfész Terjesszük ki a java.rmi.Remote interfészt
Írjuk bele a szolgáltatást, ami most két metódus add: hozzád egy számot az eddigi összeghez get: lekérdezi az eddigi összeget Gondoskodjunk arról, hogy a metódusok deklarálják a throws klózukban a java.rmi.RemoteException kivételt mellette egyebeket is deklarálhatnának... © Kozsik Tamás

21 Adder.java import java.rmi.Remote; import java.rmi.RemoteException;
public interface Adder extends Remote { void add( int a ) throws RemoteException; int get() throws RemoteException; } © Kozsik Tamás

22 RemoteAdder osztály Meg kell valósítson egy távoli interfészt, most pl. az Adder interfészt Kiterjesztjük a java.rmi.server.UnicastRemoteObject osztályt Írnunk kell konstruktort is Gondoskodni kell arról, hogy beregisztráljuk az osztály egy példányát egy registry-be pl. írhatunk egy main metódust is benne, ami ezt megteszi... © Kozsik Tamás

23 RemoteAdder.java (2/1) public class RemoteAdder
extends import java.rmi.server.UnicastRemoteObject implements Adder { int sum = 0; public RemoteAdder() throws java.rmi.RemoteException {} public void add( int a ){ sum += a; } public int get(){ return sum; } } © Kozsik Tamás

24 RemoteAdder.java (2/2) public static void main( String args[] ) throws
java.rmi.RemoteException, java.net.MalformedURLException { Adder adder = new RemoteAdder(); String name = "rmi://localhost:8000/Adder"; java.rmi.Naming.rebind(name,adder); } © Kozsik Tamás

25 Távoli interfész megvalósítása
Implementáljuk az interfészben specifikált metódusokat A throws klózban már nem kell feltüntetni a java.rmi.RemoteException kivételt persze, ha akarjuk, kiválthatjuk, és akkor fel kell tüntetni Konstruktort is kell írni, ami viszont kiválthatja ezt a kivételt, tehát nem lehet a default konstruktorra támaszkodni. © Kozsik Tamás

26 UnicastRemoteObject Érdemes ebből származtatni a távoli objektumok osztályát Kényelmi osztály toString, equals, hashCode “exportálás”, leszármazásnál automatikus Pont-pont (unicast, és nem broadcast) kommunikáció Alapértelmezett socket-os megvalósítása az RMI-nek © Kozsik Tamás

27 Ha nem leszármazott... Meg kell valósítani az RMI specifikációban adott szemantikával az Object-beli műveleteket Explicit exportálni kell a távoli objektumot hogy az RMI rendszer tudomást szerezzen róla UnicastRemoteObject.exportObject(…) © Kozsik Tamás

28 A beregisztrálás módja
Megfelelő biztonsági felügyelő (security manager) installálása A távoli objektum osztályának példányosítása Bejegyzés pl. rmiregistry-be vagy más szolgáltatóba, pl. JNDI © Kozsik Tamás

29 Bejegyzés Ahhoz, hogy egy kliens szerezni tudjon egy referenciát élete első távoli objektumára A többire már tud referenciát szerezni ettől Predefinit távoli objektum: RMI registry Név alapján lehet tőle távoli objektumokra referenciát kérni Szolgáltatás elindítása: rmiregistry API hozzá: java.rmi.Naming © Kozsik Tamás

30 registry rmi://számítógép:port/név
Ha nem adunk meg számítógépet, akkor az aktuális számítógép Ha nem adunk meg portot, akkor 1099 Ha bejegyeztünk egy távoli objektumot, akkor már van egy referencia rá, ezért nem lehet őt felszabadítani szemétgyűjtéssel, ezért a main végetérése után nem áll le a prg. © Kozsik Tamás

31 A kliens Biztonsági felügyelő beállítása Távoli referencia beszerzése
Távoli metódusok hívása © Kozsik Tamás

32 Client.java import java.rmi.*; class Client {
public static void main(String[] args) throws Exception { System.setSecurityManager( new RMISecurityManager() ); String name = "rmi://localhost:8000/Adder"; Adder adder = (Adder) Naming.lookup(name); for( int i = 0; i<args.length; i++ ) adder.add(Integer.parseInt(args[i])); System.out.println("Az összeg: "+adder.get()); } © Kozsik Tamás

33 System.get/setSecurityManager()
Biztonsági felügyelő Védi a virtuális gépet és az azt futtató rendszert a letöltött kódtól (pl. lokális fájlrendszer elérése) Kötelező definiálni, ha azt akarjuk, hogy dinamikus osztályletöltés menjen paraméterek, visszatérési értékek, kivételek típusára java.rmi.RMISecurityManager Olyasmi, mint ami az appletek esetén is van Lehet mást is beállítani, vagy jogokat adni egy policy fájllal System.get/setSecurityManager() © Kozsik Tamás

34 Elhelyezés egy gépen belül
kliens Adder.class Client.class policy szerver RemoteAdder.class RemoteAdder_Stub.class © Kozsik Tamás

35 policy Egy nagyon engedékeny (és ezért nagyon veszélyes) megoldás:
grant { permission java.security.AllPermission; }; © Kozsik Tamás

36 policy Egy nem annyira engedékeny megoldás: grant {
permission java.net.SocketPermission "*: ", "connect,accept"; }; © Kozsik Tamás

37 Futtatás (Windows) rmiregistry (pl. rmiregistry 8000) szerver indítása
java -Djava.rmi.server.codebase= file:/c:\adder\szerver/ RemoteAdder kliens indítása java -Djava.rmi.server.hostname=localhost -Djava.security.policy=policy Client ... © Kozsik Tamás

38 Elhelyezés HTTP-szerveren
A csonk (RemoteAdder_Stub.class) letölthető helyen, pl: A szerveroldali fájlok egy szerver gépen: Adder.class, RemoteAdder.class, RemoteAdder_Stub.class A kliensoldali fájlok egy kliens gépen: Adder.class, Client.class, policy © Kozsik Tamás

39 Futtatás rmiregistry szerver indítása (ugyanazon a gépen)
java -Djava.rmi.server.codebase= RemoteAdder kliens indítása java -Djava.rmi.server.hostname=localhost -Djava.security.policy=policy Client ... © Kozsik Tamás

40 Archívum fájl használata
A kliensoldali fájlokat összecsomagoljuk client.jar Esetleg a szerveroldaliakat is... Futtatáskor: -classpath © Kozsik Tamás

41 Bonyolultabb példa Olyan távoli objektumot fogunk írni, ami valamilyen feladatot old meg. Az, hogy mi a feladat, ismeretlen akkor, amikor a távoli objektumot elkészítjük. Annyit tudunk csak, hogy leírható egy bizonyos interfésszel. A dinamikus osztálybetöltés gondoskodik a többiről… © Kozsik Tamás

42 Az RMI megvalósítása JRMP RMI over IIOP v1.1 (Skel és Stub)
v1.2 (csak Stub) RMI over IIOP © Kozsik Tamás

43 nem referencia szerint, hanem érték szerint
Paraméterátadás Szerializációval A szintaxis hasonlít a lokális metódushívásra, de: nem referencia szerint, hanem érték szerint © Kozsik Tamás

44 RMI és appletek Egy jó felhasználási területe az RMI-nek a visszahívásos technika egy megvalósítása Az applet (ami egy távoli objektum) beregisztrálja magát egy szervernél (ami szintén egy távoli objektum) A szerver visszahívja az appletet, ha történt valami... © Kozsik Tamás

45 (un)marshalling Az RMI kommunikáció során a metódushívást elkódolja a rendszer metódus, paraméterek, visszatérési érték Az információkból az egyik fél szerializáció segítségével adatfolyamot állít elő A partner az adatfolyamból visszanyeri az információkat © Kozsik Tamás

46 LocateRegistry.createRegistry()
Ha programból indítanánk az rmiregistry-t java.rmi.registry.LocateRegistry osztály public static void main( String[] args ) throws Exception { LocateRegistry.createRegistry(1099); Remote r = new RemoteAdder(); Naming.rebind("rmi://localhost/Adder",r); } © Kozsik Tamás

47 Szemétgyűjtés Sokkal nehezebb feladat az elosztott szemétgyűjtés, mint az egy virtuális gépen belüli Az RMI-ben megvalósítottak egy ilyet A használt hálózati objektumok segítik ezt a szemétgyűjtő mechanizmust © Kozsik Tamás

48 Aktiválás Ha olyan szerver kell, amelyet a rendszer automatikusan tud aktiválni, amikor erre szükség van java.rmi.activation Származtassunk le az Activatable osztályból a UnicastRemoteObject helyett Példa: to be done... © Kozsik Tamás


Letölteni ppt "RMI = Remote Method Invocation"

Hasonló előadás


Google Hirdetések