Za zadanie można dostać maksymalnie 15 punktów.
Na wykonanie zadania jest dodatkowy tydzień - termin oddania zadania to poniedziałek 01.06 godz. 8:00.
Zadanie składa się z 3 części, za każdą część można dostać 5 punktów. Części 2. i 3. zależą od części 1., ale między sobą są niezależne.
Do zadania należy wykonać schemat. W każdej części 1 z 5 punktów do uzyskania jest za część schematu związaną z tą częścią zadania (sumarycznie z 15 możliwych punktów 3 punkty są za schemat).
Część 1:
Z użyciem platformy Akka zaimplementuj serwis porównujący ceny danego przedmiotu w różnych sklepach:
-
Klienci to aktorzy w systemie Akka
-
Serwer to aktor w systemie Akka (tworzy kolejnych aktorów wedle potrzeb)
-
Klientów oraz serwer można uruchomić w jednej aplikacji (jeden system aktorów - nie trzeba korzystać z Remoting)
-
Klienci wysyłają zapytania podając nazwę przedmiotu
-
Serwer sprawdza cenę w dwóch sklepach i zwraca niższą z nich
-
Sprawdzenie ceny symulujemy przez uśpienie na czas z zakresu 100 do 500 ms, a następnie zwrócenie losowej wartości z przedziału 1 do 10
-
Serwer ma być w stanie obsługiwać wielu klientów jednocześnie
-
Czas obsługi pojedynczego klienta ma być jak najkrótszy (m.in. sprawdzanie cen w sklepach powinno być równoległe)
-
Zakładamy maksymalny czas na obsługę jednego zlecenia od klienta 300 ms - należy zaimplementować obsługę timeout'u zapytań o ceny - na wyniki czekamy w sumie do 300 ms
-
Jeśli w podanym czasie dostaniemy dwie ceny, zwracamy niższą z nich, jeśli dostaniemy jedną, zwracamy tę cenę, jeśli żadnej, zwracamy komunikat o braku dostępności cen dla tego przedmiotu
-
Proszę zwrócić uwagę na odpowiednią obsługę błędów oraz czasu życia aktorów
Część 2:3
Dodaj funkcjonalność zapisywania oraz odczytywania historii wyszukiwań:
-
Przy każdym zapytaniu od klienta należy wpisać do lokalnej bazy danych informację o wystąpieniu tego zapytania
-
Przy odpowiedzi na zapytanie klienta, serwer, poza ceną, zwraca dodatkowo informację ile razy to zapytanie już wystąpiło
-
Baza danych ma mieć jedną tabelę z polami: zapytanie oraz liczba wystąpień
-
Jeśli zapytania nie ma w bazie, dodajemy je z liczbą wystąpień 1
-
Jeśli już jest w bazie, zwiększamy mu liczbę wystąpień o 1
-
Można wykorzystać dowolną bazę danych (np. SQLite działający w pojedynczym pliku, bez systemu bazodanowego)
-
Proszę zwrócić uwagę, aby zapis do bazy nie spowalniał odpowiedzi do klienta (zakładamy, że w bardzo krótkim czasie możemy dostać bardzo dużo zapytań)
Część 3:
Wykorzystaj Akka-HTTP w formie serwera oraz klienta:
-
Z użyciem Akka-HTTP uruchom serwer http, który będzie stanowił interfejs dostępowy do systemu porównywania cen
-
Serwer po wpisaniu zapytania w postaci odpowiedniej ścieżki ma zwracać odpowiedź podobną jak w konsoli
-
Format ścieżki: localhost:8080/price/[nazwa_przedmiotu], np. localhost:8080/price/laptop
-
Test działania wykonujemy przez przeglądarkę lub narzędzie konsolowe, które wypisuje odpowiedź http
-
Wskazówki: https://developer.lightbend.com/guides/akka-http-quickstart-java/http-server.html
-
Z użyciem Akka-HTTP dodaj funkcjonalność sprawdzania opinii o produkcie
-
Funkcjonalność ma być dostępna pod zapytaniem localhost:8080/review/[nazwa_przedmiotu]
-
Należy wysłać zapytanie z nazwą przedmiotu do serwisu opineo.pl, a następnie wypisać sekcję 'Zalety' dla pierwszej znalezionej pozycji
-
Wskazówki - kod do pobierania treści strony:
Http.get(system).singleRequest(HttpRequest.create(url)).thenCompose(response ->
response.entity().toStrict(timeout, materializer)).thenApply(entity ->
entity.getData().utf8String()).thenAccept(body -> ...
Zadanie można wykonać w dowolnym języku wspierającym platformę Akka lub jej odpowiednik.