標籤:who 筆記 調用 new err 發送訊息 dap adapter gets
官方文檔: http://developer.lightbend.com/guides/akka-quickstart-java/?_ga=2.177525157.1012573474.1504767665-546319647.1504766934
一. AKKA Hello World example :
1.首先需要建立一個ActorSystem, 它是所有Actor啟動並執行容器.
2.其次建立Greeter Actor和Printer Actor.
3.發送訊息到Greeter Actor執行個體, 它們會先在內部儲存訊息.
4.最後Greeter Actor裡面的指令訊息會觸發它們發送訊息給Printer Actor, 然後Printer Actor會執行對應的操作.
二. 定義Actors和messages
messages可以是任意類型(any subtype of Object).
當定義Actors和它們的messages時, 要遵守以下規範:
1.因為messages是Actor的公用API, 所以給messages定義名稱的時候要富含語義以及特定領域的意義.
2.messages是不可變的, 因為它們在不同的線程之間共用.
3.把Actor相關的messages作為靜態內部類放到Actor類中, 這樣更容易理解actor需要處理什麼類型的訊息.
4.在Actor類中, 使用靜態方法props描述如何構造Actor.
1 package com.lightbend.akka.sample; 2 3 import akka.actor.AbstractActor; 4 import akka.actor.ActorRef; 5 import akka.actor.Props; 6 import com.lightbend.akka.sample.Printer.Greeting; 7 8 public class Greeter extends AbstractActor { 9 static public Props props(String message, ActorRef printerActor) {10 return Props.create(Greeter.class, () -> new Greeter(message, printerActor));11 }12 13 static public class WhoToGreet {14 public final String who;15 16 public WhoToGreet(String who) {17 this.who = who;18 }19 }20 21 static public class Greet {22 public Greet() {23 }24 }25 26 private final String message;27 private final ActorRef printerActor;28 private String greeting = "";29 30 public Greeter(String message, ActorRef printerActor) {31 this.message = message;32 this.printerActor = printerActor;33 }34 35 @Override36 public Receive createReceive() {37 return receiveBuilder()38 .match(WhoToGreet.class, wtg -> {39 this.greeting = message + ", " + wtg.who;40 })41 .match(Greet.class, x -> {42 printerActor.tell(new Greeting(greeting), getSelf());43 })44 .build();45 }46 }
1 package com.lightbend.akka.sample; 2 3 import akka.actor.AbstractActor; 4 import akka.actor.ActorRef; 5 import akka.actor.Props; 6 import akka.event.Logging; 7 import akka.event.LoggingAdapter; 8 9 public class Printer extends AbstractActor {10 static public Props props() {11 return Props.create(Printer.class, () -> new Printer());12 }13 14 static public class Greeting {15 public final String message;16 17 public Greeting(String message) {18 this.message = message;19 }20 }21 22 private LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this);23 24 public Printer() {25 }26 27 @Override28 public Receive createReceive() {29 return receiveBuilder()30 .match(Greeting.class, greeting -> {31 log.info(greeting.message);32 })33 .build();34 }35 }
三.建立Actor對象
Actor不能用過new來建立, 而是通過工廠來建立Actor對象, 工廠返回的不是actor執行個體, 而是一個引用akka.actor.ActorRef, 這個引用指向actor執行個體.
akka.actor.ActorSystem類似於Spring的BeanFactory. 它作為Actor的容器, 管理actor的生命週期. Factory 方法actorOf通過兩個參數建立Actor對象, 一個參數是設定物件Props, 一個參數是actor的名稱.
1 final ActorRef printerActor = 2 system.actorOf(Printer.props(), "printerActor");3 final ActorRef howdyGreeter = 4 system.actorOf(Greeter.props("Howdy", printerActor), "howdyGreeter");5 final ActorRef helloGreeter = 6 system.actorOf(Greeter.props("Hello", printerActor), "helloGreeter");7 final ActorRef goodDayGreeter = 8 system.actorOf(Greeter.props("Good day", printerActor), "goodDayGreeter");
四. 非同步通訊
Actor是響應式的和訊息驅動的. 一個Actor不會做任何事情知道它接收到一個訊息.Actors通過非同步訊息來通訊. 這確保了訊息的寄件者(sender)不用停下來等待它們的訊息被接受者(recipient)處理. 相反的, 寄件者只要把訊息放到接收者的郵筒(mailbox)裡後就可以去幹別的事了. 而這個郵筒本子上是一個有序的訊息佇列. 來自同一個Actor的多條訊息是有序的, 而來自不同的Actor的訊息是交錯的.
當actor不處理訊息的時候是處於一個暫停狀態, 此時它不消耗除記憶體以外的任何資源.
五. 發送訊息到Actor
把訊息放到Actor的郵筒(mailbox)裡, 需要調用ActorRef的tell方法. 舉個栗子:
把訊息發送給Greeter Actor :
1 howdyGreeter.tell(new WhoToGreet("Akka"), ActorRef.noSender()); 2 howdyGreeter.tell(new Greet(), ActorRef.noSender()); 3 4 howdyGreeter.tell(new WhoToGreet("Lightbend"), ActorRef.noSender()); 5 howdyGreeter.tell(new Greet(), ActorRef.noSender()); 6 7 helloGreeter.tell(new WhoToGreet("Java"), ActorRef.noSender()); 8 helloGreeter.tell(new Greet(), ActorRef.noSender()); 9 10 goodDayGreeter.tell(new WhoToGreet("Play"), ActorRef.noSender());11 goodDayGreeter.tell(new Greet(), ActorRef.noSender());
Greeter Actor給Printer Actor發送訊息:
printerActor.tell(new Greeting(greeting), getSelf());
Akka Quickstart with Java-筆記