一个akka小实例

Akka中的Actor可以看作是一个个独立的实体,它们之间是毫无关联的。它们之前通过消息传递来进行通信。一个Actor收到其它Actor的消息后,它可以根据需要作出各种响应。消息的类型可以是任意的,消息的内容也可以是任意的。这点有点像webservice,只提供接口服务,你不必了解我是如何实现的。

定义一个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'.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值