Akka发送多条消息时出现死信
我对Akka很陌生,在尝试与我的参与者进行集成测试时遇到了一些问题 我有一个“TalkerSocket”演员,他有这样的接收: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"
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
块