在下面简化的代码片段中,如果重构了receive的功能,那么它不会按预期处理传入的消息。
package spack
import akka.actor.{Actor, ActorSystem, Props}
import com.typesafe.scalalogging.LazyLogging
object Main extends LazyLogging {
import logger._
def main(args: Array[String]): Unit = {
debug("start of main")
val system = ActorSystem("SampleSystem")
val ref = system.actorOf(Props[SampleActor])
ref ! "Hello"
debug("end of main")
Thread.sleep(Integer.MAX_VALUE)
}
}
class SampleActor extends Actor with LazyLogging {
import logger._
override def receive: Receive = {
case msg => {
debug("now calling handle")
handleMsg(msg)
}
}
def handleMsg(msg1: Any): Receive = {
case msg1 => debug(s"received msg is $msg1")
}
}
以上代码片段的输出: -
22:06:17.889 [main] DEBUG spack.Main$ - start of main
22:06:18.569 [main] DEBUG spack.Main$ - end of main
22:06:18.569 [SampleSystem-akka.actor.default-dispatcher-5] DEBUG spack.SampleActor - now calling handle
我在输出中也期待下线,但不知何故,它还没有到来。
收到的消息是“你好”
handleMsg
返回一个名为Receive
的Partial函数,但不对其进行求值。这就是没有显示输出的原因
context.become
来表现演员的行为要么
handleMsg
函数返回单位,而不是未评估的部分函数像下面一样定义你的handleMsg
def handleMsg(arg: Any): Unit = arg match {
case msg => debug(s"received msg is $msg")
}
要么
def handleMsg: Receive = {
case msg1 => debug(s"received msg is $msg1")
}
case msg => {
debug("now calling handle")
context become handleMsg
self ! msg
}