Professional Documents
Culture Documents
Instytut Informatyki
2002
JavaSpaces
Opracował:
Adam Świtoński
Laboratorium Architektury Komputerów – JavaSpaces
Spis treści
1
Laboratorium Architektury Komputerów – JavaSpaces
1 Opis systemu
JavaSpaces to system rozproszonych obiektów stworzony przez firmę Sun. Jest on częścią
pakietu JINI, bezpośrednio bazującego na technologiach RMI i Object Serialization, które są
wbudowane w standardowy pakiet JDK*. JavaSpaces to system bliźniaczo podobny do
systemu Linda, reprezentujący model systemu ze współdzieloną pamięcią.
Rysunek 1
• Read:
Czyta wpis pasujący do wzorca
• Write:
Zapisuje wpis do przestrzeni
• Take:
Czyta oraz pobiera wpis pasujący do wzorca
*
Java Development Kit
2
Laboratorium Architektury Komputerów – JavaSpaces
• Notify:
Przez odpowiednią procedurę obsługi zdarzeń, powiadamia o pojawieniu
się w przestrzeni wpisu o danym wzorcu
Kilka pojedynczych operacji może tworzyć transakcję, taką grupę operacji podstawowych,
która musi zostać wykonana w całości lub skutki jej działania muszą zostać wycofane.
Nie ma ograniczeń co do liczby oddzielnych przestrzeni JavaSpaces oraz klientów
w rozproszonej aplikacji. Pojedynczy klient, a nawet pojedyncza transakcja może mieć
dostęp do wielu przestrzeni JavaSpace. Istotną cechą systemu jest brak jakiegokolwiek
porządkowania wykonywanych operacji. Nie można określić jaka będzie kolejność
pobieranych/czytanych wpisów, jeśli klika spośród nich pasuje do wzorca. Podobnie wygląda
sytuacja w przypadku kilku klientów oczekujących na wpis o takim samym wzorcu.
Jak już wcześniej wspomniano, każda przestrzeń JavaSpaces przechowuje dane w postaci tak
zwanych wpisów (ang. entries), które mogą być czytane, zapisywane oraz pobierane
z przestrzeni. Każdy wpis posiada jedno lub więcej pól, które są wykorzystywane w procesie
dopasowywania nadchodzących zgłoszeń. Wszystkie zgłoszenia czytania, pobrania, bądź
powiadamiania o wpisie zawierają wzorzec, do którego dopasowywany jest wpis. Mówimy,
że obiekty wzorca i wpisu są zgodne jeśli są tego samego typu oraz wszystkie pola wzorca nie
mające wartości null muszą być identyczne z odpowiadającymi im polami wpisu. Do badania
identyczności wykorzystywana jest metoda equals klasy java.lang.Object.
2 Interfejs programistyczny
*
Serwer HTTP nie jest serwisem JINI
3
Laboratorium Architektury Komputerów – JavaSpaces
2.2 Wpisy
Każda przestrzeń JavaSpace zawiera jedynie wpisy, będące obiektami typu Entry, to znaczy
takie, które implementują interfejs Entry (net.jini.core.entry.Entry). Wpisy są zbiorem
referencji do innych obiektów.
Obiekty Entry charakteryzują się następującymi własnościami:
• Muszą być klasami publicznymi
• Wszystkie pola wewnętrzne muszą być publiczną referencją do obiektów (nie
przechowujemy typów elementarnych, ani obiektów private lub protected). Gdy
chcemy przechować zmienne elementarne korzystamy z klas zawijaczy typów:
Integer, Float, Double, Character
• Mogą mieć dowolną liczbę metod i konstruktorów
• Każde pole jest serializowane** oddzielnie, więc referencje do tych samych
obiektów spowodują i tak powstanie różnych kopii tych obiektów
• Muszą mieć bezparametrowy publiczny konstruktor
Niewłaściwy format klasy wpisu nie jest wykrywany podczas kompilacji programu, natomiast
dopiero podczas próby jego serializacji przez mechanizmy przesyłu RMI. Zły format
spowoduje wygenerowanie wyjątku.
*
RMI Remote Method Invocation. System JINI korzysta z RMI jako bazy do zdalnej komunikacji. Jest on
nakładką na RMI.
**
Serializacja jest mechanizmem umożliwiającym zapis/odczyt obiektów do strumienia.
4
Laboratorium Architektury Komputerów – JavaSpaces
W przypadku wpisów zawierających tablice należy korzystać z klas kolekcji (pakiet java.util,
klasy Vector, ArrayList, etc.)
Przykład:
Metoda write umieszcza kopię wpisu w przestrzeni JavaSpace. Każda operacja zapisu
powoduje utworzenie nowego wpisu w przestrzeni, nawet w przypadku, gdy wywołano ją
wielokrotnie z referencją do tego samego obiektu Entry.
Każde wywołanie metody write zwraca obiekt typu Lease, przechowujący informację co do
maksymalnego czasu życia wpisu w przestrzeni JavaSpace. Zwykle jest on zgodny
z wartością argumentu wywołania lease, jedynie w skrajnych przypadkach, gdy podany czas
jest zbyt duży może zostać on zredukowany.
Gdy metoda write nie spowoduje wystąpienia wyjątku, wpis zostaje wprowadzony do
przestrzeni. W przypadku, gdy wygenerowany zostanie wyjątek RemoteExcpetion,
oznaczający wystąpienie błądu podczas komunikacji ze zdalnym komputerem, operacja może,
ale nie musi zakończyć się powodzeniem. Pozostałe wyjątki powodują, że wpis nie zostaje
zapisany do przestrzeni JavaSpace.
Zapisanie obiektu może powodować wygenerowanie powiadomień dla zarejestrowanych
obiektów.
5
Laboratorium Architektury Komputerów – JavaSpaces
Przykłady :
//korzystamy z wpisu zdefiniowanego powyżej
Wpis wpis=new Wpi(”Opis”,new Integer(20),new Float(1.0));
space.write(wpis,null,defaultLease);
Operacje pobrania zachowują się dokładnie z tak samo jak operacje odczytu, z tym że
dodatkowo usuwają przeczytane wpisy z przestrzeni JavaSpace. Jeśli zostanie wygenerowany
wyjątek UnusableEntryException, oznaczający, że nie wszystkie pola wpisu zostały
prawidłowo odczytane, wpis pomimo tego zostaje usunięty z przestrzeni.
6
Laboratorium Architektury Komputerów – JavaSpaces
Metoda notify pozwala śledzić pojawianie się w przestrzeni JavaSpace wpisów o określonym
wzorcu. W momencie, gdy w przestrzeni pojawi szukany obiekt, generowane jest zdarzenie
RemoteEvent i wywoływana jego procedura obsługi listener, podana jako parametr
wywołania metody notify. Argument lease określa czas w milisekundach przez jaki będzie
śledzone pojawienie się wpisu. Parametr handback to obiekt przekazywany do procedury
obsługi zdarzenia jako dodatkowa informacja o źródle rejestracji powiadomienia.
3 Transakcje
Wszystkie operacje na przestrzeni JavaSpace jako jeden z argumentów wywołania pobierają
identyfikator transakcji, będący obiektem klasy Transaction. Wartość null tego argumentu
oznacza powstanie transakcji zawierającej tylko wskazaną operację, w trybie automatycznego
potwierdzenia (ang. autocommit mode).
Transakcje wywierają wpływ na operację w następujący sposób:
• Write: Każdy wpis zapisywany do przestrzeni nie jest widoczny poza transakcją,
aż do momentu zatwierdzenia transakcji. Jeśli wpis zostanie pobrany w ramach tej
samej transakcji, nie będzie on wstawiony do przestrzeni, nawet po zatwierdzeniu
transakcji. W momencie, gdy transakcja jest wycofywana wszystkie jej wpisy
wprowadzone do przestrzeni JavaSpace są usuwane.
• Read: Operacja odczytu może dopasowywać wpisy w ramach własnej transakcji
lub z całej przestrzeni. W ramach własnej transakcji widoczne są również wpisy,
które nie zostały jeszcze zatwierdzone wraz z transakcją.
• Take: Reguły dopasowania są identyczne jak w przypadku operacji Read.
Dodatkowo w przypadku wycofania transakcji pobrane wpisy są ponownie
wstawiane do przestrzeni.
• Notify: Podobnie jak w przypadku operacji odczytu, powiadomienia mogą
dotyczyć wpisów w ramach transakcji lub w całej przestrzeni JavaSpace.
W ramach własnej transakcji powiadomienia będą również generowane dla
wpisów, które nie zostały jeszcze zatwierdzone wraz z transakcją.
Jeśli transakcja jest wycofywana w trakcie, gdy wykonywana jest jakaś operacja w jej
ramach, generowany jest wyjątek TransactionException.
7
Laboratorium Architektury Komputerów – JavaSpaces
Pierwszy argument tej metody to menadżer transakcji, który jest serwisem JINI. Musi on być
wcześniej uruchomiony oraz wyszukany analogicznie do serwisu JavaSpace. Drugi argument
to maksymalny czas trwania transakcji podany w milisekundach.
4 Kompilacja i uruchamianie
4.1 Kompilacja
Kompilacji dokonujemy za pomocą standardowego kompilatora javac pochodzącego z
pakietu JDK. Kompilator taki będzie wymagał jedynie dostępu do odpowiednich bibliotek
JINI:
• jini-core.jar: Interfejsy oraz klasy rdzenia JINI
• jini-ext.jar Dodatkowe Interfejsy oraz klasy JINI (np. interfejs JavaSpace)
4.2 Uruchamianie
8
Laboratorium Architektury Komputerów – JavaSpaces
Serwis lookup dalej zostanie przejęty przez demon aktywacji RMI, który będzie sterował jego
działaniem (aktywacją/deaktywacją).
Przykładowe wywołanie:
java -Djava.security.policy=
JINI_DIR\example\lookup\policy.all
-jar JINI_DIR\lib\reggie.jar
http://localhost:8081/reggie-dl.jar
JINI_DIR\example\lookup\policy.all
JINI_DIR\tmp\reggie_log
public
Przykładowe wywołanie:
java -Djava.security.policy=
JINI_DIR\example\lookup\policy.all
-jar JINI_DIR\lib\mahalo.jar
http://localhost:8081/mahalo-dl.jar
JINI_DIR\example\lookup\policy.all
JINI_DIR\tmp\trans_log
public
9
Laboratorium Architektury Komputerów – JavaSpaces
Przykładowe wywołanie:
java -Djava.security.policy=
JINI_DIR\example\books\policy.all
-Djava.rmi.server.codebase=
http://localhost:8081/outrigger-dl.jar
-Dcom.sun.jini.outrigger.spaceName=JavaSpaces
-jar JINI_DIR\lib\transient-outrigger.jar
public
4.2.5.2 PersistentSpace
Implementacja tego serwisu znajduje się w bibliotece outrigger.jar. W parametrach
wywołania przekazujemy następujące informacje:
• Zasady zabezpieczeń dla uruchamianej JVM i serwisu.
• codebase do pliku outrigger-dl.jar, w którym znajdują się biblioteki dla aplikacji
klienckich korzystających z przestrzeni JavaSpace
• Nazwę przestrzeni JavaSpace
• Nazwę katalogu z logiem
• Grupę serwisu lookup
Przykładowe wywołanie:
java -Djava.security.policy=
JINI_DIR\example\books\policy.all
-jar JINI_DIR\lib\outrigger.jar
http://localhost:8081/outrigger-dl.jar
-Dcom.sun.jini.outrigger.spaceName=JavaSpaces
JINI_DIR\example\books\policy.all
JINI_DIR\tmp\js_log
Public
10
Laboratorium Architektury Komputerów – JavaSpaces
Aplikację kliencką również wywołujemy za pomocą interpretera* java z pakietu JDK. Należy
jedynie podać do ścieżki przeszukiwania classpath biblioteki JINI: jini-core.jar i jini-ext.jar oraz
określić zasady zabezpieczeń dla uruchamianej aplikacji w pliku policy.
Przykładowe wywołanie:
java -Djava.security.policy=JINI_DIR\example\lookup\policy.all
-classpath JINI_DIR\lib\jini-core.jar;JINI_DIR\jini1_2_1_001\lib\jini-ext.jar;.;
ProgramJavaSpace arg1 arg2
5 Przykładowe programy
5.1 Producent-konsument
int defaultLease=100000;
int id=1; //Identyfikator aktualnie produkowanego/konsumowanego wpisu
//Konstruktor
public ProducentKonsument()
{
//Wyszukanie serisu typu lookup
Space.discoverLookupServices(null);
}
• Dla obecnych maszyn wirtualnych Java nie jest to już interpreter w dosłownym znaczeniu tego słowa.
11
Laboratorium Architektury Komputerów – JavaSpaces
while(true)
{
//Wyprodukowanie wpisu
Data data=produce();
//Zapisanie wpisu do przestrzeni JavaSpace
space.write(data,null,defaultLease);
}
//Wyprodukowanie wpisu
private Data produce()
{
Data data=new Data();
data.desc="Porcja";
data.id=new Integer(id++);
return Data;
}
//Pobranie wpisu
data=(Data)space.take(data,null,defaultLease);
//Skonsumowanie wpisu
cosnume(data);
}
} catch(Exception ex)
{
System.out.println(ex);
}
}
12
Laboratorium Architektury Komputerów – JavaSpaces
}
}
5.2 Nadzorca-wykonawca
1 2 4 ⋅ Pćwierćkola
Pćwierćkola = ⋅ ∏⋅r ⇒ ∏= 2
4 r
Do wyznaczenia pola powierzchni ćwierćkola zastosujemy metodę losowych strzałów Monte
Carlo.
13
Laboratorium Architektury Komputerów – JavaSpaces
2 2
y≤ r −x
gdzie (x,y) to współrzędne wylosowanego punktu.
int defaultLease=100000;
//Konstruktor
public PDistApp()
{
//Wyszukanie serisu typu lookup
Space.discoverLookupServices(null);
}
14
Laboratorium Architektury Komputerów – JavaSpaces
task.parameter=new Integer((shot+shotPerTask)<=numOfShots
?(shotPerTask):(numOfShots-shot));
space.write(task,null,defaultLease);
}
int totalHits=0;
int totalMisses=0;
Result result=new Result();
try {
//pobranie referencji do przestrzeni JavaSpace
JavaSpace space=Space.getSpace(“spaceName”);
while(true)
{
Task task=new Task(); //wpis z opisem podzadania
task.parameter=null;
//Pobranie zadamoa
task=(Task)space.take(task,transaction,defaultLease);
15
Laboratorium Architektury Komputerów – JavaSpaces
//wykonanie podzadania
Result result=work(task.parameter);
Zwrócenie rezultatów
space.write(result,transaction,defaultLease);
/Zatwierdzenie transakcji
transaction.commit();
}
} catch(Exception ex)
{
System.out.println(ex);
}
}
for(int i=0;i<numOfShots;i++)
{
// r=1
double x=random.nextDouble();
double y=random.nextDouble();
if((x*x+y*y)<=1)
hits++;
else
misses++;
return result;
}
}
}
16