Actors是被動的和消息驅動的,Actors在收到消息以前不會作任何事,使用異步消息進行通訊。這確保發送方不會停留在等待其消息由接收者處理。相反,發送者將消息發送到收件人的郵箱中,並能夠自由地進行其餘工做。Actors的郵箱本質上是一個具備排序語義的消息隊列。從同一個Actor發送的多個消息的順序保存下來,可是能夠與其餘Actor發送的消息交織在一塊兒。html
您可能會想知道當Actors不是處理消息時,即在實際工做時,在作什麼?它處於一個懸浮狀態,它不消耗除內存以外的任何資源。再次顯示出Actors的輕量級、高效的性質。微信
要將消息放到Actors郵箱裏,使用ActorRef的「!(bang)方法」。例如,helloworld的主類將消息發送給相似於此的Greeter Actor:框架
Greeter Actor也發消息給Printer Actor:printerActor ! Greeting(greeting)異步
咱們已經研究瞭如何建立Actor和發送消息。如今,讓咱們經過對主要類的總體進行回顧。ide
helloworld中的主類建立並控制了Actors。注意使用一個ActorSystem做爲容器和使用actorOf建立Actors。最後,該類發送消息給Actors。函數
一樣地,讓咱們再看看定義Actors和接受的消息的完整源代碼(詳細代碼)。工具
做爲另外一個最佳實踐,咱們應該提供一些測試覆蓋率。測試
helloworld示例中的測試說明了使用Scalatest框架,測試覆蓋率還不夠完整。它簡單地說明了測試Actor代碼和提供一些基本概念是多麼容易。你能夠繼續完整,來鍛鍊增長你本身的知識 。ui
咱們開始看看AkkaQuickstartSpec.scala源文件中測試類的定義:spa
測試類繼承了akka.test.TestKit,它是Actors和Actors系統集成測試的模塊。這個類只使用了的TestKit提供的一部分功能,其餘擴展類則來自於ScalaTest。它們爲helloworld測試用例提供語法和功能。例如,經過擴展FlatSpecLike,咱們能夠用「x應該y」格式編寫測試規範,例如:
既然咱們知道了一些基本概念,讓咱們來看看已經實現的測試方法。
集成測試能夠幫助咱們確保參與者在異步運行。第一個測試使用TestProbe來詢問並驗證預期的行爲。讓咱們來看看源代碼片斷:
一旦咱們引用了TestProbe,咱們將它傳遞給了Greeter做爲構造函數參數的一部分,而後咱們給Greeter發送兩條信息;一個設置問候人打招呼,另外一個觸發問候。TestProbe上的expectMsg方法驗證消息是否已發送(完整示例)。
示例代碼只會觸及到的中可用的基本功能,如今咱們已經測試了全部代碼。
您能夠從命令行或IDE運行HelloWorld應用程序。可是,在咱們再次運行應用程序以前,讓咱們快速查看一下構建工具:sbt。
sbt使用build.sbt文件來處理項目。這個項目的build.sbt文件以下所示:
這個構建文件很是簡單。從本質上說,它建立了一個項目Hel-AkkaScala,並聲明瞭項目依賴關係。咱們還必須聲明使用哪一個版本的sbt,這是在文件project/build.properties中完成的:
正如前面所作的那樣,從控制檯運行應用程序:
1./sbt
-> OSX/Linux 或者 sbt.bat
-> Windows
sbt下載項目依賴項,> 提示符表示SBT已在交互模式下啓動。
2.而後咱們輸入 reStart
而後咱們能夠看到如下的輸出:
還記得測試實現將Printer Actor設置爲使用Akka記錄器嗎?這提供了許多額外的信息。例如,日誌輸出包含Actor的時間和名稱。讓咱們先關注Actor的輸出:
這是咱們向GreeterActor發送消息的代碼的結果:
嘗試再運行幾回代碼,並確保注意到日誌記錄的順序。你注意到了嗎?順序不是固定的,這裏發生了什麼?異步行爲變得明顯。這對你來講多是一種新的思惟模式。可是,一旦你得到了經驗,一切都會變得清晰;就像「黑客帝國」中的尼歐同樣。
有什麼討論的內容,能夠加我微信公衆號: