2016-05-16 59 views
3

Akka文档说明不扫描邮箱中的邮件。每个消息按照它们到达的顺序依次处理(默认为FIFO)。然而,当我从一个演员发送一个消息到另一个不匹配的接收演员时,它既不会被移动到deadletters actor(它会出现在日志中,我想),也不会阻止处理邮箱中的下一条消息一秒钟后到达,可以正确处理。使用Akka会发生什么不匹配的消息?

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

我在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 

回答

3

docs

复制请注意,阿卡演员收到消息循环是面面俱到, 相比,Erlang和已故Scala的演员是不同的。这 意味着你需要为 它可以接收所有邮件,提供匹配的模式,如果你希望能够处理来历不明的邮件 那么你需要有一个默认的情况下,在上面的例子。 否则akka.actor.UnhandledMessage(消息,发件人,收件人) 将发布到ActorSystem的EventStream。

还有unhandled方法Actor您可以覆盖的特征。 (docs

def unhandled(message: Any): Unit

用户重写的回调。

当消息未被当前行为的行为者默认处理时调用,它会因akka.actor.DeathPactException(未处理的akka​​.actor.Terminated消息)或发布akka而失败。 actor.UnhandledMessage到演员的系统的akka​​.event.EventStream

相关问题