在開始討論Akka中對Actor的生命周期管理前,我們先探討一下所謂的Actor編程模式。對比起我們習慣的行令式(imperative)編程模式,Actor編程模式更接近現(xiàn)實中的應(yīng)用場景和功能測試模式。這是因為Actor是靠消息來驅(qū)動的,每種消息代表一項功能的運算指令。由于消息驅(qū)動式的程序是松散耦合的,每項功能都是在獨立的線程中運算,互不干擾依賴,所以我們可以很自然的分開來實現(xiàn)各項功能以及獨立測試每項功能。雖然Akka同時提供了Java和Scala兩種API,但可能由于Akka本身是用Scala開發(fā)的,所以感覺用Scala來開發(fā)Akka程序會更自然些:籠統(tǒng)來講,Actor編程主要就是對receive函數(shù)的實現(xiàn)。而receive函數(shù)就是幾個普通的功能函數(shù)用模式匹配的方式按消息類型進行調(diào)用。receive函數(shù)所調(diào)用的功能函數(shù)可以是任何JVM兼容語言函數(shù),由于每個Actor的運算都在自己獨立的線程里進行,所以我們不必擔心Actor函數(shù)在運行中的交叉調(diào)用問題。Akka程序本就是一種原生的多線程程序,每個Actor都在一個自己的線程內(nèi)獨立運算它的receive函數(shù)。除此之外Actor的運算環(huán)境可以在任何不同的JVM里,只要Akka信息發(fā)送能實現(xiàn)跨JVM投遞的話,實現(xiàn)分布式程序也是自然而然的事了。所以,理論上Akka編程初學者應(yīng)該把主要注意力放在這個receive函數(shù)的實現(xiàn)上來,按照一種模版式的方式來編寫Akka程序就可以了,如下面演示的這個模版例子:
import akka.actor._object MyActor { //在這個伴生對象里申明MyActor所支持的功能指令 sealed trait ActorCommands case object RunFuncA extends ActorCommands case object RunFuncB extends ActorCommands }//假設(shè)有funcA,funcB. 它們可以從任何JVM函數(shù)庫里調(diào)用val funcA : () => Any = ???val funcB : () => Any = ???class MyActor extends Actor { import MyActor._ var stateValue: Any = _ //內(nèi)部狀態(tài),代表這個Actor的當前運算結(jié)果 override def receive: Receive = { case RunFuncA => stateValue = funcA //運算funcA,更新stateValue case RunFuncB => stateValue = funcB //運算funcB,更新stateValue ... } }
網(wǎng)友評論