来自Akka actor接收方法的方法调用不处理传递的消息

问题描述 投票:0回答:1

在下面简化的代码片段中,如果重构了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

我在输出中也期待下线,但不知何故,它还没有到来。

收到的消息是“你好”

scala akka actor
1个回答
1
投票

Problem:

handleMsg返回一个名为Receive的Partial函数,但不对其进行求值。这就是没有显示输出的原因

  1. 使用context.become来表现演员的行为

要么

  1. 使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")
  }

You can use become

case msg => {
  debug("now calling handle")
  context become handleMsg
  self ! msg
}
© www.soinside.com 2019 - 2024. All rights reserved.