ПредишенСледващото

Ака - библиотека за Java и Scala, която изпълнява агенти, актьори, взаимодействие между участниците в мрежата, както и много други udobnyashki. В първо приближение, това прилича Erlang или Cloud Haskell. но всъщност е много по-мощен Ака. Например, с помощта на Ака, лесно можете да комбинирате няколко машини в клъстер, който ще се контролира от изчезването и появата на леки автомобили, както и актьорите ще бъдат преместени автоматично от машина на машина като промените в размер на клъстера. И това е само един пример. В тази публикация ще напиша просто приложение, което използва, Ака, за да покаже колко лесно е да се работи с тази библиотека.

Приема се също така, че знаете какво модела на актьори и че знаете как се работи с Futura в Scala.

Open build.sbt Ака и се свържете с нашия проект:

libraryDependencies + =
"Com.typesafe.akka" %% "Ака-актьор"% "2.3.6"

Напиши просто актьор, който съхранява двойки ключ-стойност:

При клас SetRequest # 40; ключ. String, стойност. низ # 41;
При клас GetRequest # 40; ключ. низ # 41;
При клас GetResponse # 40; ключ. опция # 91; низ # 93; # 41;

клас MapActor простира актьор с ActorLogging # 123;
Вал състояние. непостоянен. карта # 91; String, String # 93; = Непостоянно. Карта. празен

дефиниция получават = # 123;
R случай. SetRequest =>
състояние + = R. ключ -> R. стойност
R случай. GetRequest =>
подател. GetResponse # 40; състояние. получавам # 40; R. ключ # 41; # 41;
при г =>
влезте. предупредителен # 40; и "Неочакван: $ R" # 41;
# 125;
# 125;

Както можете да видите, това е доста проста. Ще получите съобщение като SetRequest, актьор Мари запазва ключ-стойност двойка. Ако актьор идва GetRequest, той открива, Мари в стойността на преминал ключ и изпраща искане на подателя GetResponse с опцията за тип на стойност намерен # 91; низ # 93; ,

За начало трябва да се създаде актьори ActorSystem:

възрази пример 2 простира App # 123;
Вал система = ActorSystem # 40; "Система" # 41;
Вал mainActor = система. actorOf # 40; подпори # 40; новият MainActor # 41. "MainActor" # 41;
система. awaitTermination # 40; # 41;
# 125;

Тук ние се създаде един актьор MainActor и в очакване на приключване на работа ActorSystem. MainActor определя, както следва:

При обект Старт

клас MainActor простира актьор с ActorLogging # 123;
имплицитно Val изчакване = Timeout # 40; 5 секунди # 41;
Вал mapActor = контекст. actorOf # 40; подпори # 40; новият MapActor # 41. "MapActor" # 41;

замените деф preStart # 40; # 41; # 123;
самостоятелно. начало
# 125;

дефиниция получават = # 123;
При Start =>
mapActor. "Dummy поискване"
mapActor. SetRequest # 40; "Ключ". "Стойност" # 41;
Вал respF = mapActor. GetRequest # 40; "Ключ" # 41;
respF pipeTo самостоятелно

R случай. GetResponse =>
влезте. предупредителен # 40; и "Отговор: $ R" # 41;
контекст. система. изключване # 40; # 41;
# 125;
# 125;

Както можете да видите, това създава MapActor, които са определени по-рано. Също така, когато започнете MainActor се изпрати съобщение Start (виж метод preStart). При получаване на това съобщение на актьор MapActor'u изпраща три съобщения. Изпращането на първите две съобщения са на принципа на огън и забравят. Но когато отправя искане GetRequest актьор очаква да получи никакъв отговор, така че вместо това. (Произнася се "каже" или "взрив") се използва оператор. (Произнася «попитам»).

Последно Futuro връща със сървъра за отговор respF. По този начин, не се случва, блокиране, за разлика, например, от gen_server: Обадете се в Erlang. На следващо място, с помощта на интригант pipeTo ние изпращаме отговор, когато той стане факт за себе си. Излишно е да казвам, pipeTo работи не само с себе си, но и с всички други участници. Когато най-накрая MainActor получава отговор (GetResponse), тя просто го отпечатва на страницата за вход, а след това спира ActorSystem.

Между другото, това е за оператора. Имаме нужда от имплицитна (мълчаливо) аргумент изчакване.

Програмният код в пълен размер:

пакетиране мен. EAX. akka_examples

внос Ака. актьор. _
внос Ака. модел. # 123; поиска, тръби # 125;
внос Ака. Util. Timeout

внос Скала. колекция. _
внос Скала. едновременно. продължителност. _
внос Скала. едновременно. ExecutionContext. Implicits. в световен мащаб

При клас SetRequest # 40; ключ. String, стойност. низ # 41;
При клас GetRequest # 40; ключ. низ # 41;
При клас GetResponse # 40; ключ. опция # 91; низ # 93; # 41;

клас MapActor простира актьор с ActorLogging # 123;
Вал състояние. непостоянен. карта # 91; String, String # 93; = Непостоянно. Карта. празен

дефиниция получават = # 123;
R случай. SetRequest =>
състояние + = R. ключ -> R. стойност
R случай. GetRequest =>
подател. GetResponse # 40; състояние. получавам # 40; R. ключ # 41; # 41;
при г =>
влезте. предупредителен # 40; и "Неочакван: $ R" # 41;
# 125;
# 125;

При обект Старт

клас MainActor простира актьор с ActorLogging # 123;
имплицитно Val изчакване = Timeout # 40; 5 секунди # 41;
Вал mapActor = контекст. actorOf # 40; подпори # 40; новият MapActor # 41. "MapActor" # 41;

замените деф preStart # 40; # 41; # 123;
самостоятелно. начало
# 125;

дефиниция получават = # 123;
При Start =>
mapActor. "Dummy поискване"
mapActor. SetRequest # 40; "Ключ". "Стойност" # 41;
Вал respF = mapActor. GetRequest # 40; "Ключ" # 41;
respF pipeTo самостоятелно

R случай. GetResponse =>
влезте. предупредителен # 40; и "Отговор: $ R" # 41;
контекст. система. изключване # 40; # 41;
# 125;
# 125;

възрази пример 2 простира App # 123;
Вал система = ActorSystem # 40; "Система" # 41;
Вал mainActor = система. actorOf # 40; подпори # 40; новият MainActor # 41. "MainActor" # 41;
система. awaitTermination # 40; # 41;
# 125;

Сключването на програмата (taymstempy и мениджъри, информация пропуснати):

[Ака: // система / потребител / mainActor / mapActor] Неочаквано: сляпо искане
[Ака: // система / потребител / mainActor] Отговор: GetResponse (Някои (стойност))

И ако не работи на случаен принцип с Ака някой от читателите?

Подобно на този пост? Споделете с другите:

Свързани статии

Подкрепете проекта - споделете линка, благодаря!