一個超簡單的akka actor例子
阿新 • • 發佈:2018-12-25
拋開復雜的業務邏輯,讓我們從一個超級簡單的例子學習Akka Actor的用法。 Scala cookbook的作者Alvin Alexander在他的網站上提供了兩個例子。
本文翻譯、整理於他的兩篇文章。
下面幾行程式碼就實現了一個actor。
123456789101112131415161718 |
import akka.actor.Actorimport akka.actor.ActorSystemimport akka.actor.Propsclass HelloActor extends Actor { def receive = { case "hello" => println("您好!" |
- 1到3行是引入必要的類
- 第5行定義了一個Actor, 實現了receive方法, 如果接收到"hello",返回一個禮貌性的"您好", 如果接收到其它訊息,返回"您是?"
- 第12行定義了一個main物件
- 我們需要一個ActorSystem,所以在第13行建立了一個
- 第15行建立了一個HellActor的例項,返回結果型別為ActorRef。 這裡HelloActor我們呼叫預設的建構函式,你也可以呼叫特定的帶引數的建構函式
- 第16,17行我們傳送了兩個訊息給這個actor, actor應該能收到這兩條訊息並處理
!
是一個簡化傳送訊息的操作符,
ScalaActorRef為ActorRef定義的一個隱式方法。
123 |
trait ScalaActorRef { ref: ActorRef ⇒ def !(message: Any)(implicit sender: ActorRef = null |
假定你已經安裝了scala和sbt。建立一個資料夾,在此資料夾中新建一個build.sbt
,內容如下:
12345 | name := "Hello Test #1" version := "1.0" scalaVersion := "2.11.4"libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.3.9" |
我機器上安裝scala的版本為2.11.4
,你可以調整為你機器上合適的版本,以及相應的akka的版本。
將上述actor的程式碼複製到此資料夾下的HelloActor.scala
檔案中。
執行下面的命令:
1 | C:\akka>sbt run |
輸出結果
12345678910111213141516171819202122 | C:\akka>sbt run[info] Set current project to Hello Test #1 (in build file:/C:/akka/)[info] Updating {file:/C:/akka/}akka...[info] Resolving org.scala-lang#scala-library;2.11.4 ... [info] Resolving com.typesafe.akka#akka-actor_2.11;2.3.9 ... [info] Resolving org.scala-lang#scala-library;2.11.5 ... [info] Resolving com.typesafe#config;1.2.1 ... [info] Resolving org.scala-lang#scala-compiler;2.11.4 ... [info] Resolving org.scala-lang#scala-reflect;2.11.4 ... [info] Resolving org.scala-lang.modules#scala-xml_2.11;1.0.2 ... [info] Resolving org.scala-lang.modules#scala-parser-combinators_2.11;1.0.2 ... [info] Resolving jline#jline;2.12 ...[info] Done updating.[warn] Scala version was updated by one of library dependencies:[warn] * org.scala-lang:scala-library:2.11.4 -> 2.11.5[warn] To force scalaVersion, add the following:[warn] ivyScala := ivyScala.value map { _.copy(overrideScalaVersion = true) }[warn] Run 'evicted' to see detailed eviction warnings[info] Running Main您好!您是? |
Ctrl
+ C
可以終止程式的執行。
這裡還有一個更復雜的例子,涉及到兩個actor的互動。 就像兩個人在乒乒乓乓的打乒乓球。 兩個actor來回的ping pang,直到達到特定的次數才停止。
123456789101112131415161718192021222324252627282930313233343536373839404142434445 | import akka.actor._case object PingMessagecase object PongMessagecase object StartMessagecase object StopMessageclass Ping(pong: ActorRef) extends Actor { var count = 0 def incrementAndPrint { count += 1; println("ping") } def receive = { case StartMessage => incrementAndPrint pong ! PingMessage case PongMessage => if (count > 9) { sender ! StopMessage println("ping stopped") context.stop(self) } else { incrementAndPrint sender ! PingMessage } }}class Pong extends Actor { def receive = { case PingMessage => println(" pong") sender ! PongMessage case StopMessage => println("pong stopped") context.stop(self) context.system.shutdown() }}object PingPongTest extends App { val system = ActorSystem("PingPongSystem") val pong = system.actorOf(Props[Pong], name = |