Technologia Programowania 2016/2017 Wykªad 10 Akka, Jakub Lemiesz
Plan 1 Omówienie przykªadowej aplikacji Akka (aprokysmacja liczby pi) 2 Wprowadzenie framework'a webowego (wspóªpracuj cego z Akka) 3 Przykªadowa aplikacja w (podstawa do przerobienia go na aplikacj webow ) 2 / 23
Przykªadowa aplikacja przybli»anie liczby pi Wzór Leibniz'a: Im wi cej wyrazów uwzgl dnimy tym lepsze przybli»enie π = 3, 141592653589793... Zadanie ªatwo jest przyspieszy, mo»emy podzieli sumowanie na kilka niezale»nych zada«, wykona te zadania równolegle i poª czy wyniki Plik pom.xml dla aplikacji Pi, uruchamiamy: mvn compile exec:java -Dexec.mainClass="$package$.Pi" 3 / 23
Jaka liczba Workerów w PiSystem jest optymalna? 4 / 23
Podsumowuj c, co robimy? 1 Deniujemy niezmienne (ang. immutable) klasy wiadomo±ci - wszystkie pola sa nal. 2 Deniujemy aktorów (extends UntypedActor) oraz przesªaniamy metod onrecive(...), która okre±la akcje w zale»no±ci od rodzaju wiadomo±ci 3 Okre±lamy hierarchie aktorów (kto kogo tworzy) 4 Aktorzy komunikuj si wysyªaj c wiadomo±ci: polecenie tell() oraz metoda OnRecive() (nie powinno by innych publicznych metod) 5 / 23
Akka ma bardzo dobr dokumentacj http://doc.akka.io/docs/akka/2.4/java.html (uwaga na wersj ) 6 / 23
Framework 1 Open-source'owy framework do tworzenia aplikacji webowych (jak to brzmi po polsku?) 2 Oparty na Akka (wydajno± ) i ªatwy w obsªudze (próba zrobienia Ruby on Rails dla Java/Scala??) 3 Šatwy w obsªudze convention over conguration domy±lnie: model-view-controller pattern piszesz i widzisz 7 / 23
Framework piszesz i widzisz Problem wielu frameworków jest skomplikowana procedura wdra»ania na serwerze aplikacji W ka»da zmiana w kodzie jest widoczna po przeªadowaniu strony: automatyczna prekompilacja ¹ródeª i informacje o bª dach Analizujemy przykªad: websocket-logger.zip (jest na mojej stronie) 8 / 23
Jak zacz : www.playframework.com Inne ¹ródªa: Typesafe Activator? Sporo ksi»ek, samouczków ( Framework Cookbook) Niezªe szkolenie na Youtube 9 / 23
Jak uruchomi aplikacj? Unikaj ±cie»ek z polskimi znakami lub spacjami! 1 Pobierz (program testowaªem na ver. 2.2.1) 2 Upewnij si,»e polecenie play dziaªa w konsoli (np. dopisz ±cie»k do zmiennej systemowej Path) 3 W konsoli wejd¹ do katalogu, do którego rozpakowaªe± przykªadowy program 4 Wywoªaj polecenie: play run, które powinno uruchomi program (czyli serwer) 5 W przegl darce otwórz kilka okien i adres localhost:9000 6 Mo»emy analizowa komunikacja mi dzy klientami - jakie ramki id od i do klientów (np. w Chrome Narz dzia dla programistów Network Websockets). 10 / 23
schemat dziaªania 11 / 23
Push vs. Poll (poll odpytywa ) Polling klient okresowo odpytuje serwer Pushing serwer 'wypycha' informacje (streaming - np. Web Sockets) HTTP dziaªa na zasadzie» danie-odpowied¹ (polling), serwer nie inicjuje komunikacji 12 / 23
Wykorzystamy WebSocekts do komunikacji klient-aktor 13 / 23
Web Sockets 1 Stosunkowo nowy standard (2011) wprowadzaj cy do sieci WWW trwaª, dwukierunkow komunikacj czasu rzeczywistego (chat, gry,...) 2 Serwer mo»e sam inicjowa komunikacj 3 Po stronie przegl darki wykorzystuje JavaScript, wymaga przegl darek obsªuguj cych HTML 5 4 Najpierw HTTP handshake przywitanie po HTTP i ustalenie kanaªu (sockets) mi dzy klientem a 'zasobem' na serwerze, potem komunikacja po TCP 14 / 23
Web Socket handshake Podgl d ramek na»ywo w Google Chrome: 15 / 23
Web Socket po stronie przegl darki 1 Po stronie przegl darki JavaScript: var Socket = new WebSocket(adres_gniazda); 2 Metody Socket.send(data) - wysyªanie danych do serwera Socket.close() - zamykanie poª czenia 3 Zdarzenia Event EventHandler open (uzyskanie poª czenia) Socket.onopen message (nowe dane z serwera) Socket.onmessage error (bª d w komunikacji) Socket.onerror close (zamkni cie poª czenia) Socket.onclose 16 / 23
Do przesyªania komunikatów: JavaScript Object Notation XML <menu value="file"> <items> <item value="open" id="1" /> <item value="close" id="2" /> </items> </menu> JSON {"menu": { "value": "File", "items": { "item": [ {"value": "Open", "id": "1"}, {"value": "Close", "id": "2"} ] }}} 17 / 23
struktura projektu 18 / 23
View Scala Templates 1 do generowania widoków (stron) wykorzystuje ScalaTemplates (ST) 2 ST zawiera kod Scali i HTML z którego generowane s strony (poza nagªówkiem wszytko mo»e by HTML'em, od naszej znajomo±ci Scali zale»y ile jej u»yjemy) 3 @ - oznaczaja pocz tek kodu Scala, np. <h1>welcome @\{customer.name\}!</h1> 19 / 23
View Scala Templates Plik 1 Je±li zdeniujesz plik views/xxx.scala.html zostanie wygenerowana funkcja views.html.xxx(...) 2... i mo»emy w dowolnym miejscu wywoªa views.html.info(customer, orders) app/views/info.scala.html @(customer: Customer, orders: Seq[Order]) <h1> Welcome @customer.name! </h1> <ul> @orders.map { order => <li> @order.title </li> } </ul> 20 / 23
Controller pow zanie kontrolera i zapyta«plik conf/routes # This file defines all application routes # Higher priority routes first GET / controllers.application.index() GET /room controllers.application.chatroom(username: String?= null) GET /room/chat controllers.application.chat(username) 21 / 23
Controller app/controllers/application.java 1 Ka»da publiczna statyczna metoda kontrolera jest zwi zana z pewnym» daniem HTTP (GoF:Facade) public static Result index() { return ok(index.render()); 2 Mog zwraca stron lub np. WebSocket public static WebSocket<JsonNode> chat(stri { return new WebSocket<JsonNode>() {...} 3 W kodzie JavaScript wysªanym do klienta = new WebSocket("@routes.Application.chat(user). websocketurl(request)") 22 / 23
Model wykorzystanie systemu Akka class Human extends UntypedActor {... class Table extends UntypedActor {... public class Move {//message final int X; final int Y; //player sends a Move table.tell(new Move(X,Y), getself()); //Table send confirmation getsender().tell(new Ack(),getSelf()); 23 / 23