定义一个Actor,只需要继承 akka.actor.Actor ,并实现receive方法即可。
class School extends Actor {
def receive = {
case msg: String => println("School name is " + msg)
case _ => println("Unknown school name.")
}
}
要创建Actor实例,则需要通过ActorSystem的actorOf方法:
val system = ActorSystem("SchoolSystem")
val school = system.actorOf(Props[School])
val school1 = system.actorOf(Props[School], name = "SCNU")
val school2 = system.actorOf(Props(new School()),name="SCAU")
ActorSystem之于Actor,有点类似于java.lang.Object,它是所有Actor的根对象。actorOf是ActorSystem创建Actor的方法,它返回一个ActorRef。客户端呢,并不会直接和Actor通信,而是通过ActorRef进行,其相当于一个代理的角色。
Actor与Actor之间的消息传递方法,就是使用一个叹号(!),可以发送任意类型:
school ! "SCAU"
school1 ! "2008"
下面给出一个完整的例子:
import akka.actor._
case object PingMessage
case object PongMessage
case object StartMessage
case object StopMessage
class Ping(pong: ActorRef) extends Actor {
var count = 0
def incrementAndPrint { count += 1; println("ping")}
def receive = {
case StartMessage =>
incrementAndPrint
pong ! PingMessage
case PongMessage =>
incrementAndPrint
if(count > 50) {
sender ! StopMessage
println("ping stopped")
context.stop(self)
} else {
sender ! PingMessage
}
case _ => println("Ping got something unexpected.")
}
}
class Pong extends Actor {
def receive = {
case PingMessage =>
println(" pong")
sender ! PongMessage
case StopMessage =>
println("pong stopped")
context.stop(self)
case _ => println("pong got something unexpected.")
}
}
object PingPongTest extends App {
val system = ActorSystem("PingPongSystem")
val pong = system.actorOf(Props[Pong], name = "pong")
val ping = system.actorOf(Props(new Ping(pong)), name = "ping")
ping ! StartMessage
system.shutdown()
}
运行结果如下:
ping
pong
ping
……
ping
pong
ping
[INFO] [04/20/2015 21:49:51.284] [PingPongSystem-akka.actor.default-dispatcher-3] [akka://PingPongSystem/user/pong] Message [chx.cookbook.PingMessage$] from Actor[akka://PingPongSystem/user/ping#1127221107] to Actor[akka://PingPongSystem/user/pong#-1484898170]
was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.