Zdalne wywołanie metod - koncepcja Oprogramowanie systemów równoległych i rozproszonych Wykład 7 RMI (Remote Method Invocation) - obiektowe RPC, dostarcza klientowi interfejs do obiektu, implementacja obiektu jest ukryta przed klientem (implementacja obiektu może ulec zmianie pod warunkiem, że interfejs obiektu pozostaje bez zmian). Dr inż. Tomasz Olas olas@icis.pcz.pl Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska. 1/21 Odniesienie do obiektu Rodzaje obiektów Odniesienie obiektowe (ang. object reference) - globalny w skali systemu adres obiektu, odniesienie może być przekazywane pomiędzy procesami pracujacymi na różnych maszynach, wnętrze odniesienia jest zazwyczaj ukryte przed procesem, problemy implementacyjne: jak zabezpieczyć odniesienie przed unieważnieniem z powodu awarii serwera? jaka informacja powinna być zaszyta w odniesieniu. rozwiazania: rejestr obiektów, serwer lokalizacji. Implementacja obiektu: obiektowa - realizowana przez obiekty języka programowania, nieobiektowa - jest wymagany adapter obiektu. Trwałość obiektów: obiekty trwałe (ang. persistemt) - sa niezależne od serwera i moga przetrwać jego awarię, obiekty nietrwałe (ang. transient) - istnieja tak długo jak działa serwer.. 3/21
Wywołania statyczne i dynamiczne Java - RMI Wywołania statyczne: z pomoca statycznego pieńka. Wywołania dynamiczne: bez statycznej wiedzy o obiekcie, przykładowe zastosowanie - przegladarka obiektów. Ogólna postać wywołania dynamicznego: invoke(obiekt, metoda, argumenty_wejściowe, argumenty_wyjściowe) np. dla wywołania MojObiekt.MojaMetoda(i): invoke(mojobiekt, ID(MojaMetoda), i, NULL) RMI to podstawowy mechanizm typu RPC dostępny w języku Java. W przeciwieństwie do Sun RPC jest mechanizmem w pełni obiektowym i nowoczesnym. W przeciwieństwie do RPC nie wprowadza żadnych nowych elementów wykraczajacych poza sam język. Językiem specyfikacji interfejsu jest sama Java. RMI zostało właczone do JDK w wersji 1.1. Zdalny obiekt w całości znajduje się na jednej maszynie.. 5/21 Model przepływu danych Definicja interfejsu w RMI Intefejs zdalny w RMI jest po prostu interfejsem języka Java. Każdy interfejs zdalny musi spełniać następujace warunki: musi rozszrzać interfejs java.rmi.remote, wszystkie jego metody musza deklarować klauzula throws możliwość rzucenia wyjatku java.rmi.remoteexception.. 7/21
Komunikacja pomiędzy klientem i serwerem RMI - przekazywanie parametrów (I) public class MojSerwer extends UnicastRemoteObject implements Remote public Double zdalnametoda(object p) throws RemoteException p.innametoda(); W jaki sposób jest przekazywany parametr p będacy obiektem?. 9/21. RMI - prezkazywanie parametrów (II) RMI - prezkazywanie parametrów (III) Przekazywanie przez wartość/kopię (ang. pass-by-value/copy) Przekazywanie przez odniesienie (ang. pass-by-reference). 11/21.
rmiregistry Obsługa obiektów - klasa Naming Do nawiazania łaczności pomiędzy klientem a serwerem służy rejestr serwerów (rmiregistry). Realizuje on wyszukiwanie obiektów na podstawie ich nazwy. Nazwa obiektu przyjmuje format URL //host:port/nazwa, gdzie: host - nazwa lub adres komputera gdzie uruchomiony jest rejestr, port - numer portu (domyślnie 1099), nazwa - nazwa przyjęta dla obiektu zdalnego w rejestrze. Do obsługi rejestracji w rmiregistry służa statyczne metody klasy java.rmi.naming: lookup() - zwraca obiekt zdalny zwiazany z podana nazwa, bind() - wiaże obiekt zdalny z podana nazwa - jeśli podana nazwa już występuje zwracany jest wyjatek klasy AlreadyBoundException, rebind() - wiaże obiekt zdalny z podana nazwa - jeśli podana nazwa już występuje przypisany do niej obiekty jest zastępowany nowym, unbind() - usuwa powiazane nazwy z obiektem zdalnym w rejestrze, list() - zwraca listę nazw obiektów występujacych w rejestrze (lista obiektów typu String).. 13/21. Implementacja klasy serwera Bezpieczeństwo RMI Aby metody obiektu mogły być zdalnie dostępne, musi on spełniać dwa warunki: implementować jakiś interfejs zdalny, być wyeksportowany. Eksport obiektu oznacza otwarcie odpowiedniego portu i rozpoczęcie nasłuchu. Najprościej uzyskać ten efekt dziedziczac z którejś z podklas klasy java.rmi.server.remoteserver, np: java.rmi.server.unicastremoteobject - dla niezwielokrotnionych nietrwałych obiektów, java.rmi.server.activatable - dla obiektów trwałych. Niektóre operacje wymagaja jawnego wskazania, że moga zostać wykonane, np ładowanie kodu z zewnatrz. Program Java może utworzyć zarzadce bezpieczeństwa (ang. Security manager), który ustala politykę bezpieczeństwa (ang. Security policy). W języku Java można w tym celu użyć specjalnej klasy RMISecurityManager. Do zdefiniowania zasad bezpieczeństwa można użyć obiektu klasy Policy lub pliku konfiguracyjnego security.policy, np: grant permission java.security.allpermission; ;. 15/21.
Przykład - Definicja interfejsu Przykład - klasa serwera import java.rmi.*; public interface MojInterfejs extends Remote public Double zdalnametoda(int i) throws RemoteException; // inne zdalne funkcje... import java.rmi.*; import java.rmi.server.*; import java.net.*; public class MojSerwer extends UnicastRemoteObject implements MojInterfejs public MojSerwer() throws RemoteException... public Double zdalnametoda(int i) throws RemoteException... public static void main(string []t) try MojSerwer ob = new MojSerwer(); Naming.rebind("MojInterfejs", ob); catch (RemoteException re)... catch (MalformedURLException ue).... 17/21. Przykład - klasa klienta Przyklad - kompilacja import java.rmi.*; public class MojKlient public static void main(string args[]) if (System.getSecurityManager() == null) System.setSecurityManager(new RMISecurityManager()); try MojInterfejs s =(MojInterfejs)Naming.lookup("rmi://localhost/MojInterfejs");... catch (Exception e)... javac MojInterfejs.java wynik: MojInterfejs.class javac MojSerwer.java wynik: MojSerwer.class javac MojKlient.java wynik: MojKlient.class rmic MojSerwer wynik: MojSerwer_Stub.class, MojSerwer_Skel.class. 19/21.
Przykład - uruchomienie Uruchomienie rejestru serwerów: rmiregistry Uruchomienie serwera: java MojSerwer Uruchomienie klienta: java -Djava.security.policy=dostep.policy MojKlient. 21/21