Akka Quickstart with Java-筆記

來源:互聯網
上載者:User

標籤: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-筆記

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.