Composing trait behavior in Scala in an Akka receive method

后端 未结 2 724
野趣味
野趣味 2020-12-23 22:21

Consider these two traits:

trait Poked extends Actor {
  override def receive = {
    case Poke(port, x) => ReceivePoke(port, x)
  }

  def ReceivePoke(po         


        
2条回答
  •  感情败类
    2020-12-23 23:07

    You can use empty Receive in base actor class and chain receives in their definitions. Sample for Akka 2.0-M2:

    import akka.actor.Actor
    import akka.actor.Props
    import akka.event.Logging
    import akka.actor.ActorSystem
    
    class Logger extends Actor {
      val log = Logging(context.system, this)
    
      override def receive = new Receive {
        def apply(any: Any) = {}
        def isDefinedAt(any: Any) = false
      }
    }
    
    trait Errors extends Logger {
      override def receive = super.receive orElse {
        case "error" => log.info("received error")
      }
    }
    
    trait Warns extends Logger {
      override def receive = super.receive orElse {
        case "warn" => log.info("received warn")
      }
    }
    
    object Main extends App {
      val system = ActorSystem("mysystem")
      val actor = system.actorOf(Props(new Logger with Errors with Warns), name = "logger")
      actor ! "error"
      actor ! "warn"
    }
    

提交回复
热议问题