RMI - ćwiczenie czwarte
Notification Server - samodzielna implementacja aplikacji
Celem zadania jest stworzenie w technologii rozproszonej RMI serwera,
który zbiera i magazynuje napływające doń informacje o zdarzeniach.
Następnie, na żądanie, udostępnia owe informacje zarejestrowanym
klientom.
Przykładowa realizacja składa się z następujących elementów:
- Notification - interfejs definiujący funkcjonalność serwera
- NotificationServer - serwer aplikacji utrzymujący zbiór (kolejkę)
zdarzeń, dodający do tego zbioru nowe zdarzenia i udostępniający owe
zdarzenia klientom
- Event - klasa opisująca pojedyncze zdarzenie, może zawierać
dowolnie wybrane pola czy metody (uwaga: obiekty
tej klasy będą przekazywane poprzez zdalne połączenie RMI)
- EventGenerator - typ klienta, który tworzy nowe
zdarzenia i rejestruje je w serwerze
- EventMonitor - typ klienta, który pobiera instniejące zdarzenia
z serwera (i, dla przykładu, wypisuje je na stdout)
Wskazówki i pomysły
- Można dobrać się w dwie osoby i podzielić pracą!
- Oba typy klientów mogą działać jednorazowo lub też w jakiegoś
rodzaju pętli (z udziałem człoweka lub bez)
- Klasa Event jest dobrym elementem do wykorzystania
polimorfizmu - można spróbować stworzyć podklasy charakteryzujące się
innym typem niesionej informacji (klasę bazową można uczynić abstrakcyjną
lub zamienić ją na interfejs)
- Serwer można wyposażyć w różne kolejki zdarzeń z różnymi nazwami
(tzw. topic) - wtedy monitory mogą pobierać tylko te zdarzenia,
którymi są zainteresowane
- W RMI łatwiej zaimplementować model powiadamiania typu pull
(klient sam zgłasza się po wiadomości) - spróbować zaimplementować także
model push (klient rejestruje się w serwerze jako zainteresowany i
jest automatycznie powiadamiany w chwili nadejścia wiadomości)
- Czasem warto rozbić funkcjonalność takiego serwera na dwie części
(osobno przyjmowanie i publikowanie zdarzeń) - dlaczego?
Metody i obiekty które mogą się przydać:
- Thread.sleep(int) - uśpienie (w milisekundach)
- Calendar.getInstance().getTime() - czas
- Calendar.getInstance().getTimeInMillis() - czas w [ms]
- java.util - pakiet zawierający kolekcje obiektów
- System.in.read() - czytanie z strumienia wejściowego
Tomasz Gubała