Systemy rozproszone | Technologie middleware - ICE

Transkrypt

Systemy rozproszone | Technologie middleware - ICE
Systemy rozproszone | Technologie middleware - ICE
© Łukasz Czekierda, [email protected]
Lokalizacja ICE na komputerach w laboratorium: c:\Program Files\Zeroc\Ice-3.5.1 (ICE_DIR)
Kompilacja pliku slice (Demo.slice) do Java: slice2java --output-dir generated slice\Demo.slice
Uruchamianie serwera: java Server --Ice.Config=config.server
Uruchamianie klienta: java Client --Ice.Config=config.client
1) Rozpakuj projekt i zaimportuj go do eclipse (File | Import | General | Existing project into workspace) i
dodaj do projektu zewnętrzną referencję do Ice.jar (ICE_DIR\lib\Ice.jar) (Build path | Configure Build
Path | Libraries | Add external JAR)
2) Plik .slice skompiluj ręcznie lub włącz Ice Builder we właściwościach projektu
3) Przejrzyj kod źródłowy (włącznie z wygenerowanymi - katalog generated) oraz pliki konfiguracyjne
(*.config).
4) Uruchomienie aplikacji
a) Samodzielnie przetestuj działanie aplikacji.
b) Przetestuj działanie aplikacji w parach odpowiednio modyfikując konfigurację.
c) Prześledź komunikację sieciową (wireshark, filtr po używanym porcie TCP).
5) Zainstancjonowanie kolejnego serwanta
a) Utwórz kolejny obiekt serwanta, skojarz z innym obiektem.
b) Przetestuj działanie aplikacji.
6) Rozbudowa interfejsu
a) Rozbuduj interfejs Calc o operację avg przyjmującą jako argument seq sekwencję liczb float i
zwracającą wartość float. Użyj wbudowanego typu Ice::FloatSeq.
b) Przy ręcznej kompilacji użyj opcji -I wskazując katalog ICE_DIR\slice.
c) Zaimplementuj odpowiednio tę metodę (skorzystaj z podpowiedzi eclipse odnośnie sygnatury).
d) Przetestuj działanie rozszerzenia (w parach).
7) Asynchronous Method Invocation
a) Zmodyfikuj implementację serwanta Calc, by wywołanie operacji add1 trwało długo (np. 5 sekund);
przetestuj działanie aplikacji
b) Zmodyfikuj aplikację kliencką, aby wywołanie zrealizować w dwóch krokach (calc1.begin_add1 i
calc1.end_add1); przetestuj działanie
c) Zmodyfikuj aplikację kliencką aby informacja o zakończeniu wywołania była uzyskana przez funkcję
callback; w wywołaniu calc1.begin_add1 użyj nowej instancji istniejącej już klasy
Callback_Calc_add1I; przetestuj działanie
8) Asynchronous Method Dispatch
a) Przejrzyj implementację operacji add2
b) Przetestuj działanie mechanizmu AMD
9) Operacje idempotentne (*)
a) Zadeklaruj odpowiednią operację jako idempotentną
b) Przetestuj działanie aplikacji
10) Wywołanie dynamiczne
a) Wywołaj operację subtract tak, jakby aplikacja nie miała w czasie kompilacji wiedzy o interfejsie
kalkulatora, użyj ice_invoke.
11) Zarządzanie serwantami
a) Używaj klasy Server2
b) Stwórz pięć nowych instancji serwantów implementujących interfejs Calc
i) Instancję #1 skojarz w tablicy ASM z obiektem k1/c111, a #2 z obiektem k1/c333
c) Stwórz (zaimplementuj - wzorując się na klasie ServantLocator1) ServantLocator i zarejestruj go
dla kategorii k1
i) dla obiektów k1/c3** powinien zwracać referencję do serwanta #3
ii) dla obiektów k1/c4** powinien zwracać referencję do serwanta #4
iii) w pozostałych przypadkach powinien zwracać null
d) Żądania kierowane do obiektów k2/c6** powinny trafiać do dedykowanych serwantów,
instancjonowanych dopiero przy pierwszym wywołaniu. Wskazówka: stwórz i zarejestruj kolejną
instancję ServantLocator.
e) Rozszerz implementację serwanta, by wywołanie subtract zwracało na konsolę identyfikację
obiektu, na rzecz którego działa.
12) Kontekst wywołania operacji
a) Dodaj do wywołania na przykładowym obiekcie następujący kontekst: klucz: „ID”, wartość: imię i
nazwisko
b) Przetestuj działanie aplikacji