例子
//#full-exampleimport akka.actor.{Actor, ActorRef, ActorSystem, Props}//#greeter-companion//#greeter-messagesobject Greeter { //#greeter-messages def props(message: String, printerActor: ActorRef): Props = Props(new Greeter(message, printerActor)) //#greeter-messages final case class WhoToGreet(who: String) case object Greet}//#greeter-messages//#greeter-companion//#greeter-actorclass Greeter(message: String, printerActor: ActorRef) extends Actor { import Greeter._ import Printer._ var greeting = "" def receive = { case WhoToGreet(who) => greeting = s"$message, $who" case Greet => //#greeter-send-message printerActor ! Greeting(greeting) //#greeter-send-message }}//#greeter-actor//#printer-companion//#printer-messagesobject Printer { //#printer-messages def props: Props = Props[Printer] //#printer-messages final case class Greeting(greeting: String)}//#printer-messages//#printer-companion//#printer-actorclass Printer extends Actor { import Printer._ def receive = { case Greeting(greeting) => println(s"Greeting received (from ${sender}): $greeting") }}//#printer-actor//#main-classobject AkkaQuickstart extends App { import Greeter._ // Create the 'helloAkka' actor system val system: ActorSystem = ActorSystem("helloAkka") //#create-actors // Create the printer actor val printer: ActorRef = system.actorOf(Printer.props, "printerActor") // Create the 'greeter' actors val howdyGreeter: ActorRef = system.actorOf(Greeter.props("Howdy", printer), "howdyGreeter") val helloGreeter: ActorRef = system.actorOf(Greeter.props("Hello", printer), "helloGreeter") val goodDayGreeter: ActorRef = system.actorOf(Greeter.props("Good day", printer), "goodDayGreeter") //#create-actors //#main-send-messages howdyGreeter ! WhoToGreet("Akka") howdyGreeter ! Greet howdyGreeter ! WhoToGreet("Lightbend") howdyGreeter ! Greet helloGreeter ! WhoToGreet("Scala") helloGreeter ! Greet goodDayGreeter ! WhoToGreet("Play") goodDayGreeter ! Greet //#main-send-messages}//#main-class//#full-example
解析
1.props 方法返回Props 執行個體,用於建立actor
2.
class Greeter(message: String, printerActor: ActorRef) extends Actor { import Greeter._ import Printer._ var greeting = "" def receive = { case WhoToGreet(who) => greeting = s"$message, $who" case Greet => printerActor ! Greeting(greeting) }}
WhoToGreet 修改actor自身的狀態,Greet把greeting發送給printerActor
3.ActorRef是actor的引用
4.akka.actor.ActorSystem 是actor建立工廠
建立printer actor
val printer: ActorRef = system.actorOf(Printer.props, “printerActor”)
5.actorRef 發送訊息用 ! actor 發送訊息是非同步。 一個actor不做任何事情直到接受到訊息
howdyGreeter ! WhoToGreet(“Akka”)