RMI = Remote Method Invocation

Slides:



Advertisements
Hasonló előadás
© Kozsik Tamás Különböző nyelvekhez igazítás Internationalization - i18n.
Advertisements

4. alkalom – Hálózat Kezelés
Osztály leszármaztatás
C++ programozási nyelv Gyakorlat hét
© Kozsik Tamás Appletek A Java nyelv elsődleges számú reklámja HTML oldalak aktívvá tevéséhez Kisalkalmazás WEB-böngésző által futtatott Java.
Programozás III KOLLEKCIÓK 2..
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Adatbányászati technikák (VISZM185)
Öröklődés 2..
© Kozsik Tamás Tömbök, kollekciók és egyéb alaposztályok.
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Objektum-elvű programozás (OOP)
© Kozsik Tamás JavaBeans Nagyon divatos technológia Nem tévesztendő össze az Enterprise Java Beans technológiával Programozási konvenciók gyűjteménye.
Csala Péter ANDN #4. 2 Tartalom  C# - ban előre definiált típusok  Változók  Változókkal műveletek  Elágazás  Ciklus.
Bevezetés a Java programozásba
Öröklődés Polimorfizmus Csomagok Absztrakt osztályok, interfészek
Fájlkezelés, IO Kivételkezelés Belső osztályok
Osztályok Garbage collection.  általában minden osztálynak vannak adattagjai és/vagy metódusai ◦ adattagok megadása:  [láthatóság] [static] [final]
Abstract osztályok és interface-ek Beolvasás és kiíratás 7. gyakorlat.
1 Fejlett Programozási Technikák 2. 15/11. Fejlett Programozási Technológiák 2. 2 A mai előadás tartalma Probléma a Java Servlet-tel Template eszközök.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 7. Gyakorlat Operator overloading.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 5. Gyakorlat Öröklődés, virtuális függvények,
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 9. Gyakorlat Alap file műveletek.
Programozás II. 3. Gyakorlat C++ alapok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Követelmények Bevezetés a Javába Első java program írása Dokumentációk
Tömbök ismétlés Osztályok Java-ban Garbage collection
A Java programozási nyelvSoós Sándor 1/17 Java programozási nyelv 4. rész – Osztályok II. Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai.
Java programozási nyelv 3. rész – Osztályok I.
A C++ programozási nyelvSoós Sándor 1/15 C++ programozási nyelv Gyakorlat hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
A C++ programozási nyelvSoós Sándor 1/12 C++ programozási nyelv Gyakorlat - 8. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
Java programozási nyelv 5. rész – Osztályok III.
Osztott alkalmazások kezelése. VIR elosztott architektúra indítékai: - meglévő komponensek integrációja - WEB / Internet elterjedése (nemzetköziség) -
WEB Technológiák Dr. Pance Miklós – Kolcza Gábor Miskolci Egyetem.
C# tagfüggvények.
C# tagfüggvények.
SPRING FRAMEWORK bemutatása
6. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.
Csomagok.
Annotációk a Java 5 nyelvben Kozsik Tamás. Annotációk Módosítószavak bővítése A programszöveg elemeihez rendelhetők –Csomagokhoz, típusokhoz, metódusokhoz,
© Kozsik Tamás Kivételek A program végrehajtása során ritkán bekövetkező események Nem a „fő végrehajtási ág”; logikailag alacsonyabbrendű feladat.
© Kozsik Tamás Csomagok. © Kozsik Tamás A program tagolása Típusdefiníciók (osztályok, interfészek) Metódusok Blokk utasítások Csomagok.
A JAVA TECHNOLÓGIA LÉNYEGE Többlépcsős fordítás A JAVA TECHNOLÓGIA LÉNYEGE Platformfüggetlenség.
Java 2 Enterprise Edition
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
A PHP 5 újdonságai Az OOP terén. Miről lesz szó? Osztályok kezelése – Új direktívák – Konstruktor – Destruktor Interfészek Kivételkezelés.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Javascript Microsoft által készített kiegészítése Statikus típusosság Nagy projektek Windows 8 fejlesztésénél WinRT egy részét ebben írták Nyílt forráskódú,
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 1. gyakorlat.
1 Verseny 2000 gyakorlat ODBC Adatforrás létrehozása.
Java programozási nyelv Metódusok
Komoróczy Tamás 1 Java programozási nyelv A nyelv alapjai.
Java programozási nyelv Adatbekérés konzolról
Generics Krizsán Zoltán. Bemutató A.NET 2.0 verziótól. A.NET 2.0 verziótól. Típusparaméter Típusparaméter Más nyelvben ez a template (sablon). Más nyelvben.
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 1. gyakorlat.
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 1. gyakorlat.
5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 6. gyakorlat.
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
Krizsán Zoltán, iit C# osztályok 2 Adattagok  Osztály hatáskörben definiált változó.  Formája: [attribútum] [módosító] típus azonosító [=kezdő érték][,
Java Önelemzés Dynamikus Proxy
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
Hálózatkezelés Java-ban
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Előadás másolata:

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

© Kozsik Tamás 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

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

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

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

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 2000-2006

Elhelyezés HTTP-szerveren A csonk (RemoteAdder_Stub.class) letölthető helyen, pl: http://localhost:8080/adder/ 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 2000-2006

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

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

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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006

(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 2000-2006

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 2000-2006

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 2000-2006

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 2000-2006