繁体   English   中英

Akka actor远程解除发送延迟响应

[英]Akka actor remote dissociation from sending a delayed response

所以我有一个基于客户端服务器的程序,客户端将向服务器发送请求,服务器将进行计算和响应。 这是通过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,也会发生相同的问题,一旦服务器尝试发送消息(完成后),服务器就会解体并发送给无效的信件。

我很茫然为什么会这样。

您遇到的问题是, 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM