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