Scala Akka参与者远程分离发送延迟响应

Scala Akka参与者远程分离发送延迟响应,scala,akka,actor,future,remote-server,Scala,Akka,Actor,Future,Remote Server,所以我有一个基于客户机-服务器的程序,客户机将向服务器发送请求,服务器将进行计算和响应。这是通过ask完成的 具体来说,客户端将从客户端应用程序接收消息并发送call ask val response = ask(actorRef, SessionMessage(token, message)).mapTo[ResponseMessage] 服务器将像这样接收它 val response = sessionMessage.message match { case mes

所以我有一个基于客户机-服务器的程序,客户机将向服务器发送请求,服务器将进行计算和响应。这是通过ask完成的

具体来说,客户端将从客户端应用程序接收消息并发送call ask

      val response = ask(actorRef, SessionMessage(token, message)).mapTo[ResponseMessage]
服务器将像这样接收它

val response = sessionMessage.message match {
      case message: message1 =>
        ask(actorSet.actor1,message)
      case message: message2 =>
        ask(actorSet.actor2,message)
其中actorset实际上是一组不同的演员

然后我收集结果并发送回发送者

val responseResult = response.mapTo[ResponseMessage]
    responseResult pipeTo sender
我遇到的问题是,对于某些请求,数据库查询可能需要5-10分钟的时间,当查询完成时,它会发送到死信,我得到一个分离,它无法再次关联并发送到死信

我认为,因为它花费了很长时间,发送者会超时,或者特别是发送者引用,所以我将发送者引用存储为val,并确认通过这样做,发送者引用丢失了。但是,一旦查询完成并通过管道将其传递给正确的发送者,它就会分离。即使是其他需要一分钟左右时间的查询似乎也不会遇到这个问题,只有持续几分钟的查询才会断开,我需要重新启动服务器,否则服务器将继续发送死信

即使我执行了onComplete,然后在成功时发送,或者执行了Wait.result,同样的问题也会发生,一旦完成后服务器尝试发送消息,服务器就会分离并发送到死信


我完全不知道为什么会发生这种情况。

您遇到的问题是ask本身有一个超时,它与您可能在wait.result中指定的超时不同。要询问的完整签名是:

这意味着,如果您没有手动提供超时值,也没有自己定义隐式超时,则必须通过导入之一继承一个

要延长特定ask的超时时间,只需调用一个:

ask(actorRef, SessionMessage(token, message))(15.minutes).mapTo[ResponseMessage]
或者,如果这适用于范围内的所有ASK,请声明您自己的隐式:


除了ask模式要求参与者有一个超时之外,我在更高的级别上定义了超时,特别是在创建参与者的地方。
ask(actorRef, SessionMessage(token, message))(15.minutes).mapTo[ResponseMessage]
implicit val timeout = Timeout(15.minutes)