Akka发送多条消息时出现死信

Akka发送多条消息时出现死信,akka,Akka,我对Akka很陌生,在尝试与我的参与者进行集成测试时遇到了一些问题 我有一个“TalkerSocket”演员,他有这样的接收: def receive = LoggingReceive { case msg: JsValue => log.info(msg.toString()) (msg \ "type").asOpt[String] match { case Some("authenticate") => println("authenticate"

我对Akka很陌生,在尝试与我的参与者进行集成测试时遇到了一些问题

我有一个“TalkerSocket”演员,他有这样的接收:

def receive = LoggingReceive {
case msg: JsValue =>
  log.info(msg.toString())

  (msg \ "type").asOpt[String] match {
    case Some("authenticate") =>
      println("authenticate")
    case None                 =>
      log.info("fail")
      out ! Json.obj("error" -> "You should specify a type")
    case t                    =>
      log.info("fail")
      out ! Json.obj("error" -> "You should specify a valid type")
  }

case _ =>
  log.info("fail")
  out ! Json.obj("error" -> "unknown message format")
}
我的测试是这样的:

val platoId = StringStub.random(6)
val platoConnection = TestProbe()
val platoSocket = system.actorOf(TalkerSocket.props(platoId)(platoConnection.ref))

def authMessage(talkerId: String) = {
    Json.parse(
      s"""
        {
          "type" : "authenticate",
          "data" : {
            "user_id" : "$talkerId",
            "auth_token" : "not_used_yet"
          }
        }
        """.stripMargin)
}
当我这样做时:

platoSocket ! authMessage(platoId)
一切看起来都很好

当我尝试发送两条消息时,例如:

platoSocket ! authMessage(platoId)
platoSocket ! authMessage(platoId)
我发现第二个错误:

[INFO] [11/25/2015 16:56:49.225] [TypingSpecLol-akka.actor.default-dispatcher-4] [akka://TypingSpecLol/user/$a] Message [play.api.libs.json.JsObject] from Actor[akka://TypingSpecLol/system/testActor1#-94087043] to Actor[akka://TypingSpecLol/user/$a#754865806] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
出于好奇,我尝试:

platoSocket ! authMessage(platoId)
Thread.sleep(1000)
platoSocket ! authMessage(platoId)
我没有从死信中得到任何错误信息


有人知道这里发生了什么吗?有没有办法知道为什么为了调试此类错误而将消息发送到死信中?

这是一个猜测,但我很确定您的消息正在杀死您的参与者(抛出了一个
异常)。如果您没有任何特殊的
SupervisorStrategy
,那么默认情况下将重新创建参与者的新实例。然后,如果您不等待就发送了两条消息,那么第二条消息将不会到达您的参与者,因为新实例正在创建中。但是,如果您稍等,将创建新实例并准备接收消息

要测试是否存在这种情况,您可以将您的
主管策略更改为在参与者死亡时记录,也可以在
接收
定义上放置
try catch