Typesafe template的一个小Akka Scala Seed,很有代表性。麻雀虽小,五脏俱全,可以以此做seed完成一些小程序。
整个项目只有三个文件,ApplicationMain.scala(main), PingActor.scala(PingActor), PongActor.scala(PongActor)。
逻辑非常简单:
- Main中创建一个PingActor,并发送初始化消息告诉PingActor。
- PingActor创建时,创建PongActor。 收到Main的初始化消息后,向PongActor发送PingMessage;收到PongMessage向sender回复PingMessage。
- PongActor收到PingMessage,向sender回复PongMessage。
- 如此反复3次后,context.system.shutdown。
ApplicationMain.scala
package com.example
import akka.actor.ActorSystem
object ApplicationMain extends App {
val system = ActorSystem("MyActorSystem")
val pingActor = system.actorOf(PingActor.props, "pingActor")
pingActor ! PingActor.Initialize
// This example app will ping pong 3 times and thereafter terminate the ActorSystem -
// see counter logic in PingActor
system.awaitTermination() // 控制 Actor system 何时停止
}
PingActor.scala
package com.example
import akka.actor.{Actor, ActorLogging, Props}
class PingActor extends Actor with ActorLogging {
import PingActor._
var counter = 0
val pongActor = context.actorOf(PongActor.props, "pongActor")
def receive = {
case Initialize =>
log.info("In PingActor - starting ping-pong")
pongActor ! PingMessage("ping")
case PongActor.PongMessage(text) =>
log.info("In PingActor - received message: {}", text)
counter += 1
if (counter == 3) context.system.shutdown()
else sender() ! PingMessage("ping")
}
}
object PingActor {
val props = Props[PingActor]
case object Initialize
case class PingMessage(text: String)
}
PongActor.scala
package com.example
import akka.actor.{Actor, ActorLogging, Props}
class PongActor extends Actor with ActorLogging {
import PongActor._
def receive = {
case PingActor.PingMessage(text) =>
log.info("In PongActor - received message: {}", text)
sender() ! PongMessage("pong")
}
}
object PongActor {
val props = Props[PongActor]
case class PongMessage(text: String)
}