为 Akka actor 定义接收方法

Defining receive method for Akka actor

来自Akka documentation

Actors are implemented by extending the Actor base trait and implementing the receive method. The receive method should define a series of case statements (which has the type PartialFunction[Any, Unit]) that defines which messages your Actor can handle, using standard Scala pattern matching, along with the implementation of how the messages should be processed.

代码:

class MyActor extends Actor {
  val log = Logging(context.system, this)

  def receive = {
    case "test" ⇒ log.info("received test")
    case _      ⇒ log.info("received unknown message")
  }
}

没有要接收的输入,那么 case 语句中匹配的是什么? 另外,PartialFunction[Any, Unit] 是怎么出现在这里的?

传递给演员的消息是匹配的 例如:如果调用 actor ! "message",则匹配 "message"

看这里

https://alvinalexander.com/scala/how-to-communicate-send-messages-scala-akka-actors

PartialFunction[Any, Unit] 出现是因为它接受 Any 类型的参数但不接受 return 任何东西。如果 "message" 被传递给 actor,那么 String 就是传递给 PartialFunction 的参数类型。在模式匹配期间,它不会 return 一个值。所以 Unit return 输入。

Actor 是消息驱动的,input 像通过即发即弃 tell 发送给 mailbox. Messages are most commonly sent to an actor 的消息一样馈送到 actor(即 ! ), 比如:

myActor ! "test"

Actor 中的 receive 方法允许对消息进行模式匹配(通常按类型)以相应地处理它们。该方法的类型为 PartialFunction[Any, Unit],因此:

  1. case 模式匹配,这是一个部分功能,非常适合作为一种筛选工具,有效处理各种类型的传入消息

  2. 它可以接受任何类型的消息,以任何必要的方式处理它们并且不需要 return 任何东西,例如:

    case i: Int => // do something with i
    case s: String => // do something with s
    // ...
    

请注意,在 unhandled messages 的情况下,在引擎盖下 UnhandledMessage() 将发布到 ActorSystem。