使用Akka的无与伦比的消息会发生什么?

时间:2016-05-16 00:10:51

标签: scala akka actor

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

1 个答案:

答案 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