Akka 中不匹配的消息会怎样?

Bar*_*adé 5 scala actor akka

Akka 文档说不会扫描邮箱中的消息。每条消息按照到达的顺序依次处理(默认为 FIFO)。但是,当我从一个参与者发送一条消息到另一个与接收参与者不匹配的消息时,它既不会移动到死信参与者(我想它会出现在日志中),也不会阻止处理邮箱中的下一条消息一秒后到达,可以正确处理。

邮箱中的不匹配邮件会发生什么情况?

我在 sbt 中使用 Scala 2.10.4 和 Akka 2.4-SNAPSHOT。

package main.scala

import akka.actor._

class SRActor(dest: ActorRef) extends Actor with ActorLogging {
  dest ! A
  dest ! B

  context.stop(self)

  override def receive = {
    case _ => {
      log.info("Finally got something")
    }
  }
}

class SRActorReceiver extends Actor with ActorLogging {
  override def receive = {
    case B =>
      log.info("Finally got B")
  }
}
Run Code Online (Sandbox Code Playgroud)

演员创作:

package main.scala

import akka.actor._
case object A
case object B

object ErrorApp extends App {
// SR: Send nowhere received
  var system6 = ActorSystem("ErrorActorSystem")
  val srActorReceiver = system6.actorOf(Props(classOf[SRActorReceiver]), "sractorreceiver")
  val sractor = system6.actorOf(Props(classOf[SRActor], srActorReceiver), "sractor")

  // wait until actors have finished
  Thread.sleep(1000)

  system6.shutdown
Run Code Online (Sandbox Code Playgroud)

Łuk*_*asz 5

从文档复制

请注意,Akka Actor 接收消息循环是详尽的,这与 Erlang 和后期的 Scala Actors 不同。这意味着您需要为其可以接受的所有消息提供模式匹配,如果您希望能够处理未知消息,那么您需要有一个默认情况,如上例所示。否则 akka.actor.UnhandledMessage(message, sender,recipient) 将被发布到 ActorSystem 的 EventStream 中。

您还可以重写特征unhandled中的方法Actor。(文档

def unhandled(message: Any): Unit

用户可重写的回调。

默认情况下,当 Actor 的当前行为未处理消息时调用,它会失败,并出现 akka.actor.DeathPactException (如果是未处理的 akka.actor.Termulated 消息)或将 akka.actor.UnhandledMessage 发布到actor系统的akka​​.event.EventStream