首页 文章

Akka演员远程分离发送延迟响应

提问于
浏览
1

所以我有一个基于客户端服务器的程序,客户端将向服务器发送请求,服务器将进行计算和响应 . 这是通过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)

演员队在字面上是一组不同的演员 .

然后我收集结果并发回给发件人

val responseResult = response.mapTo[ResponseMessage]
    responseResult pipeTo sender

我遇到的问题是,对于某些请求,数据库查询可能需要一段时间(5-10分钟),当查询完成时,它会发送到死信,我得到一个解离,它无法再次关联并发送到死信 .

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

即使我执行onComplete然后发送成功或执行Await.result,同样的问题发生,一旦它尝试发送消息(完成后)服务器解离并发送到死信 .

我很遗憾为什么会这样 .

1 回答

  • 0

    您遇到的问题是 ask 本身有一个超时,它与您在 Await.result 中指定的超时分开 . ask 的完整签名是:

    def ask (actorRef: ActorRef, message: Any)(implicit timeout: Timeout): Future[Any]
    

    这意味着如果您没有手动为 timeout 提供值并且没有自己定义隐式值,则必须通过其中一个导入继承 .

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

    ask(actorRef, SessionMessage(token, message))(15.minutes).mapTo[ResponseMessage]
    

    或者如果这适用于范围内的所有 ask ,请声明您自己的 implicit

    implicit val timeout = Timeout(15.minutes)
    

相关问题