以下是一个可以工作的Akka Actor源代码实现方式:
import akka.actor._
import scala.concurrent.duration._
case class PingMessage(id: Int, msg: String)
case class PongMessage(id: Int, msg: String)
class Ping(pong: ActorRef) extends Actor {
var count = 0
def incrementAndPrint {
count += 1
println(s"ping $count")
}
def receive = {
case StartMessage =>
println("start")
incrementAndPrint
pong ! PingMessage(count, "ping")
case PongMessage(id, msg) =>
incrementAndPrint
if (count > 99) {
sender ! StopMessage
println("ping stopped")
context.stop(self)
} else {
sender ! PingMessage(count, "ping")
}
}
}
class Pong extends Actor {
def receive = {
case PingMessage(id, msg) =>
println(s" pong $id")
sender ! PongMessage(id, "pong")
case StopMessage =>
println("pong stopped")
context.stop(self)
}
}
case object StartMessage
case object StopMessage
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.awaitTermination()
通过这种方式实现的Akka Actor源代码可以确保滑动窗口的行为符合预期,而且执行的非常好。