当前位置: 首页 > 知识库问答 >
问题:

发送多条信息时的Akka死信

严修谨
2023-03-14

我对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)

共有1个答案

颛孙霖
2023-03-14

这是一个疯狂的猜测,但我非常肯定您的消息正在杀死您的演员(一个异常被抛出)。如果您没有任何特殊的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中,中没有名为的方法。