1. 程式人生 > >一個超簡單的akka actor例子

一個超簡單的akka actor例子

拋開復雜的業務邏輯,讓我們從一個超級簡單的例子學習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("您好!"
)
case _ => println("您是?") }}object Main extends App { val system = ActorSystem("HelloSystem") // 預設的Actor建構函式 val helloActor = system.actorOf(Props[HelloActor], name = "helloactor") helloActor ! "hello" helloActor ! "喂"}
  • 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
): Unit
}

假定你已經安裝了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 =