86. Właściwości i schemat działania mechanizmu Java RMI. 87
Transkrypt
86. Właściwości i schemat działania mechanizmu Java RMI. 87
86. Właściwości i schemat działania mechanizmu Java RMI. Właściwości: Mechanizm RMI jest częścią języka Java. Umożliwia wywoływanie metod obiektów istniejących w maszynie wirtualnej Javy przez obiekty znajdujące się w innej maszynie wirtualnej – komunikacja via protokół TCP. Obiekty zdalne jak i lokalne są identyfikowane standardowo, przez referencje. Schemat działania: Wykład: A tu bardziej czytelne z JAVA2 CORE: 87. Ograniczenia RMI. Problemy rozproszonego bezpieczeństwa danych, synchronizacji, odśmiecania pamięci. Możliwe jest tylko wykonywanie metod zdalnego obiektu, a nie dostęp do jego pól (zmiennych). Metody RMI muszą być zadeklarowane w interfejsie rozszerzającym interfejs (extends) java.rmi.Remote: o wygenerowane zostaną odpowiednie procedury (marshalling code). Ograniczeniem RMI jest wsparcie tylko dla programów napisanych w javie. 88. Wymagania (na czerwono w przykładzie, dodatkowo) odnośnie implementacji interfejsu serwera i klienta RMI. Na zielono – koniecznie przeczytać, pod tym krótki opis (z wykładu) import java.rmi.*; /** Interfejs zdalnych obiektów reprezentujących produkty. */ public interface Product extends Remote { /** Zwraca opis produktu. @return opis produktu */ String getDescription() throws RemoteException; } import java.rmi.*; import java.rmi.server.*; /** Klasa implementacji zdalnych obiektów reprezentujących produkty. To one będą na serwerze */ public class ProductImpl extends UnicastRemoteObject implements Product { /** Tworzy obiekt implementacji @param n nazwa produktu */ public ProductImpl(String n) throws RemoteException { name = n; } public String getDescription() throws RemoteException { return "I am a " + name + ". Buy me!"; } private String name; } KLIENT import java.rmi.*; import java.rmi.server.*; /** Program demonstrujący sposób zdalnego wywołania metod obiektów odnajdywanych poprzez nazwy. */ public class ProductClient { public static void main(String[] args) { System.setProperty("java.security.policy", "client.policy"); System.setSecurityManager(new RMISecurityManager()); String url = "rmi://localhost/"; // należy zmienić na "rmi://yourserver.com/" // gdy serwer działa na zdalnej maszynie // yourserver.com try { Product c1 = (Product)Naming.lookup(url + "toaster"); Product c2 = (Product)Naming.lookup(url + "microwave"); //ZDALNE WYWOŁANIE METODY System.out.println(c1.getDescription()); System.out.println(c2.getDescription()); } catch(Exception e) { e.printStackTrace(); } }} SERWER import java.rmi.*; import java.rmi.server.*; /** Program serwera, który tworzy dwa zdalne obiekty rejestruje je i oczekuje na wywołania ich metod przez klientów. */ public class ProductServer { public static void main(String args[]) { try { System.out.println ("Constructing server implementations..."); ProductImpl p1 = new ProductImpl("Blackwell Toaster"); ProductImpl p2 = new ProductImpl("ZapXpress Microwave Oven"); System.out.println ("Binding server implementations to registry..."); Naming.rebind("toaster", p1); Naming.rebind("microwave", p2); System.out.println ("Waiting for invocations from clients..."); } catch(Exception e) { e.printStackTrace(); } }} • • • • • KLIENT (schemat pytanie 86) Uzyskuje referencję do zdalnego obiektu (serwera) poprzez użycie znanej mu nazwy usługi serwisu Naming: java.rmi.Naming.lookup(name) – zwraca referencję do lokalnego obiektu-namiastki, – metoda lookup() zwraca referencję uniwersalnego typu Object, a więc jest konieczne rzutowanie (cast) na typ docelowy. Wykorzystuje zdalny serwer wywołując metody uzyskanego lokalnego obiektu-namiastki. SERWER (obiekt serwera) musi implementować interfejs deklarujący metody udostępniane zdalnym klientom: – musi on rozszerzać (dziedziczyć) klasę java.rmi.Remote, – wszystkie zadeklarowane metody muszą jawnie obsługiwać wyjątki klasy RemoteException, – serwer musi rozszerzać klasę java.rmi.Server.UnicastRemoteObject. – konstruktor serwera musi również jawnie obsługiwać wyjątki klasy RemoteException. Aby umożliwić klientom odnalezienie serwera musi on się zarejestrować w serwisie RMI-Registry: java.rmi.Naming.rebind("rmi://host/Name", ServerObject) 89. Inicjacja i komunikacja usługi RMI. Inicjacja serwera(patrz kod): • – – • • • • Minimalna procedura inicjująca serwer RMI: tworzy przynajmniej jeden obiekt klasy implementującej zdalne wywołania, rejestruje ten obiekt w katalogu serwerów. Uruchomienie katalogu serwerów – rmiregistry (serwer RMI korzysta z tego, usługa rejestru początkowego) Komunikacja(kod) Obiekt RMI jest gotowy do działania natychmiast po utworzeniu. Serwis katalogowy przechowuje i udostępnia klientom nazwy zarejestrowanych obiektów- serwerów w postaci URL: rmi://nazwa_komputera/nazwa_interfejsu Klient może uzyskać referencję do lokalnej namiastki obiektu zdalnego wywołując statyczną metodę lookup klasy java.rmi.Naming i podając jako argument nazwę, pod jaką obiekt jest zarejestrowany: – rezultatem jest referencja do interfejsu java.rmi.Remote, – powinna ona być rzutowana na referencję do interfejsu implementowanego przez zdalny obiekt. Należy równiż ustawić plik policy - Konfiguracja podstawowa konfiguracji zabezpieczeń 90. Tworzenie szkieletu i namiastek za pomocą mechanizmu RMI. Od wersji JDK 1.5 nie jest konieczne generowanie szkieletu i namiastek za pomocą kompilatora rmic W celu zachowania kompatybilności z klientami utworzonymi w środowisku JDK <1.5 należy jawnie tworzyć namiastki kompilatorem rmic. • Kompilacja: $ javac MyIterationInterface.java MyIterationImplementation.java • Generowanie klasy ze szkieletem serwera i namiastkami: $ rmic MyIterationImplementation – powoduje utworzenie plików MyIterationImplementation_Skel.class, MyIterationImplementation_Stub.class zawierających odpowiednie klasy.