Wykład 7 p. 1/2 Oprogramowanie systemów równoległych i rozproszonych Wykład 7 Dr inż. Tomasz Olas olas@icis.pcz.pl Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska
Zdalne wywołanie metod - koncepcja Wykład 7 p. 2/2 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).
Wykład 7 p. 3/2 Odniesienie do obiektu 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.
Rodzaje obiektów Wykład 7 p. 4/2 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.
Wykład 7 p. 5/2 Wywołania statyczne i dynamiczne 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)
Wykład 7 p. 6/2 Java - RMI 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.
Model przepływu danych Wykład 7 p. 7/2
Definicja interfejsu w RMI Wykład 7 p. 8/2 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ć klauzul możliwość rzucenia wyj a throws atku java.rmi.remoteexception.
Komunikacja pomiędzy klientem i serwerem Wykład 7 p. 9/2
RMI - przekazywanie parametrów (I) Wykład 7 p. 10/2 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?
RMI - prezkazywanie parametrów (II) Wykład 7 p. 11/2 Przekazywanie przez wartość/kopię (ang. pass-by-value/copy)
RMI - prezkazywanie parametrów (III) Wykład 7 p. 12/2 Przekazywanie przez odniesienie (ang. pass-by-reference)
rmiregistry Wykład 7 p. 13/2 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.
Obsługa obiektów - klasa Naming Wykład 7 p. 14/2 Do obsługi rejestracji w rmiregistry służa statyczne metody klasy java.rmi.naming: lookup() - zwraca obiekt zdalny zwiazany z podana nazwa, bind() - wi aże obiekt zdalny z podana nazwa - jeśli podana nazwa już występuje zwracany jest wyjatek klasy AlreadyBoundException, rebind() - wi aż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).
Implementacja klasy serwera Wykład 7 p. 15/2 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.
Bezpieczeństwo RMI Wykład 7 p. 16/2 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; };
Przykład - Definicja interfejsu Wykład 7 p. 17/2 import java.rmi.*; public interface MojInterfejs extends Remote { public Double zdalnametoda(int i) throws RemoteException; } // inne zdalne funkcje...
Przykład - klasa serwera Wykład 7 p. 18/2 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){... }
Przykład - klasa klienta Wykład 7 p. 19/2 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){... } } }
Przyklad - kompilacja Wykład 7 p. 20/2 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
Wykład 7 p. 21/2 Przykład - uruchomienie Uruchomienie rejestru serwerów: rmiregistry Uruchomienie serwera: java MojSerwer Uruchomienie klienta: java -Djava.security.policy=dostep.policy MojKlient