[英]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.