Alapjai dolgozó szereplők Akka, programozó jegyzetek
Akka - a könyvtár a Java és a Scala, amely végrehajtja a szerek, színészek, interakció szereplői között a hálózaton, és sok más udobnyashki. Az első közelítésben ez hasonlít Erlang vagy Cloud Haskell. de valójában sokkal erősebb Akka. Például segítségével Akka, akkor könnyen össze több gép egy klaszter, amely ellenőrizni fogják eltűnése és megjelenése az autók, és a színészek lesznek automatikusan átkerülnek gépre a változásokat a klaszter méret. És ez csak egy példa. Ebben a bejegyzésben, akkor írj egy egyszerű alkalmazás, amely az Akka, megmutatni, hogy mennyire könnyű dolgozni ezzel a könyvtárban.
Az is elképzelhető, hogy tudja, mi a modell a szereplők, és hogy tudja, hogyan kell dolgozni Futura Scala.
Nyílt build.sbt Akka és csatlakozzon a projekthez:
libraryDependencies + =
"Com.typesafe.akka" %% "akka-színész" % "2.3.6"
Írj egy egyszerű színész, amely tárolja a kulcs-érték párok:
ügy osztály SetRequest # 40; gombot. String, érték. húr # 41;
ügy osztály GetRequest # 40; gombot. húr # 41;
ügy osztály GetResponse # 40; gombot. opció # 91; húr # 93; # 41;
osztály MapActor kiterjed színész ActorLogging # 123;
val állapotban. változékony. térkép # 91; String, karakterlánc # 93; = Változékony. Térkép. üres
def kap = # 123;
R. SetRequest =>
állapot + = r. gomb -> r. érték
R. GetRequest =>
feladónak. GetResponse # 40; állam. kap # 40; r. kulcs # 41; # 41;
R =>
jelentkezzen. figyelmeztetés # 40; s "Váratlan: $ r" # 41;
# 125;
# 125;
Mint látható, ez elég egyszerű. Kap egy üzenetet, mint SetRequest, színész Marie megtartja kulcsértékpárhoz. Ha egy színész érkezik GetRequest, ott találja Marie értékének az átadott kulcsot és küldi a feladó GetResponse kérelmet a talált érték típusú opció # 91; húr # 93; .
A kezdéshez létre kell hoznunk szereplők ActorSystem:
objektum 2. példa kiterjed App # 123;
Val rendszer = ActorSystem # 40; „Rendszer” # 41;
Val MainActor = rendszer. actorOf # 40; kellékek # 40; új MainActor # 41;. "MainActor" # 41;
rendszer. awaitTermination # 40; # 41;
# 125;
Itt létre kell hoznunk egy színész MainActor, és várja a munka befejezése ActorSystem. MainActor meghatározása a következő:
ügy tárgya indítása
osztály MainActor kiterjed színész ActorLogging # 123;
implicit Val timeout = Időtúllépés # 40; 5 másodperc # 41;
Val mapActor = összefüggésben. actorOf # 40; kellékek # 40; új MapActor # 41;. "MapActor" # 41;
felülírhatja def Előindított # 40; # 41; # 123;
én. kezdet
# 125;
def kap = # 123;
esetben a Start =>
mapActor. „Dummy kérés”
mapActor. SetRequest # 40; „Kulcs”. „Érték” # 41;
Val respF = mapActor. GetRequest # 40; „Kulcs” # 41;
respF pipeTo önálló
R. GetResponse =>
jelentkezzen. figyelmeztetés # 40; s "válasz: $ r" # 41;
összefüggésben. rendszer. üzemszünet # 40; # 41;
# 125;
# 125;
Mint látható, ez teremt MapActor, amelyet korábban megadott. Továbbá, ha elkezd MainActor küldött magának egy üzenetet Start (lásd prestart módszer). Kézhezvételét követően az üzenet a színész MapActor'u küld három üzenetet. Küldés az első két üzenetek elvén tűz és elfelejteni. De amikor egy kérelmet GetRequest színész arra számít, hogy érkezett válasz, így helyette. (Ejtsd «mondani» vagy «bumm») operátort használjuk. (Ejtsd «kérdezze»).
Utolsó Futuro visszatér a válasz respF szerver. Így, nem blokkoló jelenség, ellentétben, például a gen_server: hívja Erlang. Ezután egy cselszövő pipeTo küldünk választ, amikor elérhetővé válik, hogy magukat. Mondanom sem kell, pipeTo működik nemcsak a saját, hanem más szereplőkkel. Amikor MainActor végül választ kap (GetResponse), csak azt kiírja a naplót, majd megáll ActorSystem.
Mellesleg, ez az üzemeltető számára. Meg kell implicit (implicit) érv timeout.
A programkód teljes:
csomagolja rám. EAX. akka_examples
import akka. színész. _
import akka. mintát. # 123; kérni, cső # 125;
import akka. util. timeout
import scala. gyűjtemény. _
import scala. egyidejű. időtartamát. _
import scala. egyidejű. ExecutionContext. Implicits. globális
ügy osztály SetRequest # 40; gombot. String, érték. húr # 41;
ügy osztály GetRequest # 40; gombot. húr # 41;
ügy osztály GetResponse # 40; gombot. opció # 91; húr # 93; # 41;
osztály MapActor kiterjed színész ActorLogging # 123;
val állapotban. változékony. térkép # 91; String, karakterlánc # 93; = Változékony. Térkép. üres
def kap = # 123;
R. SetRequest =>
állapot + = r. gomb -> r. érték
R. GetRequest =>
feladónak. GetResponse # 40; állam. kap # 40; r. kulcs # 41; # 41;
R =>
jelentkezzen. figyelmeztetés # 40; s "Váratlan: $ r" # 41;
# 125;
# 125;
ügy tárgya indítása
osztály MainActor kiterjed színész ActorLogging # 123;
implicit Val timeout = Időtúllépés # 40; 5 másodperc # 41;
Val mapActor = összefüggésben. actorOf # 40; kellékek # 40; új MapActor # 41;. "MapActor" # 41;
felülírhatja def Előindított # 40; # 41; # 123;
én. kezdet
# 125;
def kap = # 123;
esetben a Start =>
mapActor. „Dummy kérés”
mapActor. SetRequest # 40; „Kulcs”. „Érték” # 41;
Val respF = mapActor. GetRequest # 40; „Kulcs” # 41;
respF pipeTo önálló
R. GetResponse =>
jelentkezzen. figyelmeztetés # 40; s "válasz: $ r" # 41;
összefüggésben. rendszer. üzemszünet # 40; # 41;
# 125;
# 125;
objektum 2. példa kiterjed App # 123;
Val rendszer = ActorSystem # 40; „Rendszer” # 41;
Val MainActor = rendszer. actorOf # 40; kellékek # 40; új MainActor # 41;. "MainActor" # 41;
rendszer. awaitTermination # 40; # 41;
# 125;
Az a program lezárása (taymstempy és menedzserek, információs elhagyható):
[Akka: // system / user / MainActor / mapActor] Váratlan: dummy kérelem
[Akka: // system / user / MainActor] válasz: GetResponse (Néhány (érték))
És ha nem működik véletlenszerűen Akka valaki az olvasók?