使用 PartialFunction 链来扩展actor

来源:互联网 发布:怎么查看mac系统版本 编辑:程序博客网 时间:2024/06/05 04:46
使用 PartialFunction 链来扩展actor
有一个稍高级但是非常有用的方法是定义基础的消息处理器并通过继承或委托来对它进行扩展,使用 PartialFunction.orElse 链.


abstract class GenericActor extends Actor {  // to be defined in subclassing actor  def specificMessageHandler: Receive   // generic message handler  def genericMessageHandler: Receive = {    case event ⇒ printf("generic: %s\n", event)  }   def receive = specificMessageHandler orElse genericMessageHandler} class SpecificActor extends GenericActor {  def specificMessageHandler = {    case event: MyMsg ⇒ printf("specific: %s\n", event.subject)  }} case class MyMsg(subject: String)

import akka.actor._import akka.actor.Propsimport akka.event.Loggingimport akka.actor.ActorSystemimport akka.util.Timeoutimport akka.pattern.askimport scala.concurrent.duration._import akka.actor.ReceiveTimeoutimport akka.pattern.gracefulStopimport scala.concurrent.{Await,Future}object Test4{val prop1 = Props[SpecificActor]val sytem = ActorSystem("mtSystem")implicit val timeout = Timeout(5 seconds)//创建Actorval myActor = sytem.actorOf(prop1,"first")def main(args: Array[String]): Unit = {  myActor ? MyMsg("Hello")}}abstract class GenericActor extends Actor{def specificMessageHandle:Receivedef genericMessageHandle:Receive = {case event => println("Generic: %s\n",event)}def receive = specificMessageHandle orElse genericMessageHandle}class SpecificActor extends GenericActor{def specificMessageHandle = {case  event:MyMsg => println("SpecificActor:" + event.subject) }}case class MyMsg(subject:String)


或:

trait ComposableActor extends Actor {  private var receives: List[Receive] = List()  protected def registerReceive(receive: Receive) {    receives = receive :: receives  }   def receive = receives reduce { _ orElse _ }} class MyComposableActor extends ComposableActor {  override def preStart() {    registerReceive({      case "foo" ⇒ /* Do something */    })     registerReceive({      case "bar" ⇒ /* Do something */    })  }}


0 0
原创粉丝点击