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.

Podobne dokumenty