Scala 阿卡-演员普雷斯特没有先前的消息

Scala 阿卡-演员普雷斯特没有先前的消息,scala,playframework,akka,Scala,Playframework,Akka,我有一些参与者在调用preRestart()时,“消息”是无的。我不明白为什么会这样 上下文 我的应用程序是一个使用Akka的Play web应用程序。我的错误处理策略是向请求的来源发送错误通知,以便将详细信息发送给用户。我通过如下方式连接到preRestart()来实现这一点: trait NotifyRequesterErrorHandling { this: Actor with ActorLogging => override def preRestart(reason: T

我有一些参与者在调用preRestart()时,“消息”是无的。我不明白为什么会这样

上下文

我的应用程序是一个使用Akka的Play web应用程序。我的错误处理策略是向请求的来源发送错误通知,以便将详细信息发送给用户。我通过如下方式连接到preRestart()来实现这一点:

trait NotifyRequesterErrorHandling { this: Actor with ActorLogging =>

  override def preRestart(reason: Throwable, message: Option[Any]) {
    notifyRequester(message, reason)
  }

  protected def notifyRequester(message: Option[Any], reason: Throwable) {
    message match {
      case Some(m) =>
        val who = getRequester(m)
        who ! SearchError(reason, m)
      case None =>
        val error = if (reason == null) "No exception" else reason toString()
        ReportError("NotificationError", Some(reason), "", s"${this.context.self.path}: Attempted to notify requester but no previous message")
    }
  }

  def getRequester(message: Any): ActorRef

}
问题

在我的日志中,我看到了很多“试图通知请求者但并没有以前的消息”错误日志。通常我的系统中的所有参与者都会发生这种情况。这可能是因为我有一个顶级演员,负责所有其他演员(他们都是孩子)

不过,在日志中,reason参数确实包含一个throwable

我也在使用一对一的策略。所以,基本上,每当所有参与者重新启动时,我都会遇到很多这样的错误

可能的解释或猜测

  • 所有参与者重新启动后,将创建每个参与者的新实例,因此没有以前的消息

  • 当参与者作为“一对所有”重新启动时,其所有消息都已被处理,且其队列为空。这意味着没有以前的消息


  • 重新启动前的文档说明:“消息-如果适用,参与者在失败时处理的当前消息(可选)


    也就是说,它只适用于失败的参与者。不是那些刚刚重新启动并且没有失败的人。

    为什么不改用
    OneForOneStrategy
    ?如果这些参与者通常是不相关的,那么为什么在其中一个失败时重新启动所有参与者?我同意这可能是您在
    preRestart
    Hi上没有看到先前消息的原因,大多数参与者都是相关的。它们都共享一个套接字,当其中一个套接字失败时,我们会创建一个新的套接字,因为连接错误是最常见的异常。当actor重新启动时,它会记住邮箱内容。