Akka文档说明不会扫描邮箱中的邮件。每个消息按其到达顺序一个接一个地处理(默认为FIFO)。但是,当我从一个actor发送消息到另一个不匹配的接收actor时,它既不会移动到deadletters actor(它会出现在我想的日志中)也不会阻止处理邮箱中的下一条消息一秒后到达,可以正确处理。
来自邮箱的不匹配邮件会发生什么?
我在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")
}
}
演员创作:
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
答案 0 :(得分:4)
从docs
复制请注意,Akka Actor接收消息循环是详尽的, 与Erlang和已故的Scala演员相比,这是不同的。这个 意味着您需要为所有消息提供模式匹配 它可以接受,如果你想能够处理未知的消息 那么你需要有一个默认情况,如上例所示。 否则akka.actor.UnhandledMessage(消息,发件人,收件人) 将发布到ActorSystem的EventStream。
您可以覆盖unhandled
特征中的Actor
方法。 (docs)
def unhandled(message: Any): Unit
用户可覆盖的回调。
当一个消息没有被actor的当前行为处理时被调用,默认情况下它会失败并带有akka.actor.DeathPactException(如果是未处理的akka.actor.Terminated消息)或者发布akka.actor .UnhandledMessage到actor的系统的akka.event.EventStream