Akka 是一個用 Scala 編寫的庫,用於簡化編寫容錯的、高可伸縮性的 Java 和 Scala 的 Actor 模型應用。web
Actor模型並不是什麼新鮮事物,它由Carl Hewitt於上世紀70年代早期提出,目的是爲了解決分佈式編程中一系列的編程問題。其特色以下:編程
首先經過一個簡單的例子快速簡單的介紹AKKA actor 是如何實現和使用的。網絡
建立簡單的 Actor 模式應用程序,定義EchoServer以下代碼所示,EchoServer類繼承 AKKA 中的 Actor 類,定義偏函數(Partial Function)receive,receive 函數中經過模式匹配(Pattern Match)實現程序邏輯。異步
1 package foo 2 3 import akka.actor.{ Actor, ActorSystem, Props} 4 import akka.event.Logging 5 6 object test extends App { 7 8 val system = ActorSystem() 9 10 class EchoServer extends Actor { 11 val log = Logging(context.system,this) 12 def receive = { 13 case msg: String => println("echo " + msg) 14 } 15 } 16 17 val echoServer = system.actorOf(Props[EchoServer]) 18 echoServer ! "hello!"
如上代碼所示,經過 AKKA 中的 ActorSystem 對象的 actorOf 方法建立上面的 EchoServer類對象實例,返回AKKA 中的 ActorRef 類型的 EchoServer對象, echoServer對象是 EchoServer類對象實例的引用,經過 echoServer對象能夠向 EchoServer類對象實例發送消息。分佈式
注意: 函數
建立帶參數構造器 Actor this
1 package foo 2 3 import akka.actor.{ Actor, ActorSystem, Props} 4 import akka.event.Logging 5 6 object test extends App { 7 8 val system = ActorSystem() 9 10 class Actor2(name:String) extends Actor { 11 val log = Logging(context.system,this) 12 def receive = { 13 case "hello" => log.info(name + " echo hello " ) 14 case _ => log.info(name + " unknown msg") 15 } 16 } 17 val actor2 = system.actorOf(Props(new Actor2("tom"))) 18 19 actor2 ! "hello"
如上面代碼所示,Actor2 類帶有參數的構造函數,這種狀況下沒法使用Props[Actor2]的方式建立 actor2 對象。能夠採用 call-by-name塊(參考scala相關內容)的方式建立 actor2 對象spa
注意: 線程
Actor API
Actor trait 只定義了一個抽象方法,就是上面提到的 receive, 用來實現actor的行爲。scala
若是當前 actor 的行爲與收到的消息不匹配,則會調用 unhandled, 它的缺省實現是向actor系統的事件流中發佈一條 akka.actor.UnhandledMessage(message, sender, recipient)。
另外,它還包括: