我对Akka很陌生,我在尝试与我的演员进行集成测试时遇到了一些问题。
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
,那么默认情况下将重新创建参与者的新实例。那么,如果您没有等待就发送了两条消息,那么第二条消息将无法到达您的参与者,因为新实例正在创建中。但是,如果稍候,新实例将被创建并准备接收消息。
要测试是否是这种情况,可以将supervisorStrategy
更改为在参与者死亡时进行日志记录,或者在receive
定义中放置try-catch
块。
我有一群演员互相传递很多信息。这些参与者的默认队列很可能会导致很多参与者内存不足。 理想情况下,这是我想要发生的事情: null 注意:我不想对死信进行负载平衡,有些文章建议使用死信队列进行负载平衡。
我正在尝试使用ask模式向远程参与者发送请求。本地actor接收一些值,并对其执行一些任务并更新它。然后,当本地参与者试图将更新后的值发送回远程参与者时,在发送时发生错误。我应该如何处理这个错误? 错误:[INFO][03/31/2017 17:28:18.383][ClientSystem-Akka.actor.Default-Dispatcher-3][Akka://ClientSystem/
[04/27/2014 18:09:05.518][ReadScheduler-Akka.actor.Default-Dispatcher-3][Akka://ReadScheduler/User/Collector]从参与者[Akka://ReadScheduler/User/Executor#2127791644]到参与者[Akka://ReadScheduler/User/Collector
Hi akka古鲁们:)你能在这一次指导我吗? 我要做的是-演员A向演员B要消息,然后等一个回来。但是,不知何故,演员B给A的不是一条信息,而是其中的4条信息。A正确完成,但rest消息中有3条被算作死信。为什么?这样对吗?我是说,演员A有一个合适的处理人,那为什么信都死了?:-( [INFO][11/22/2013 22:00:38.975][ForkJoinPool-2-worker-7][a
主要的类别是: 路由的执行元类为:
我读过以下文档https://doc.akka.io/docs/akka/current/general/message-delivery-reliability.html#deal-letters,其中写道: 参与者可以订阅事件流上的类Akka.actor.deadletter,请参见event stream以了解如何做到这一点。 但是在Akka Typed中,中没有名为的方法。