我有一条喷雾路线,我宣布我的一个演员 .
val myActor = actorRefFactory.actorSelection("/user/my-actor")
我的路线看起来像:
get {
path(Segment / Segment) { (poolId, trackId) =>
respondWithMediaType(MediaTypes.`application/json`) {
val request = Request(poolId, trackId)
val f = (myActor ? request)
.recoverWith {
case a: AskTimeoutException =>
Future.failed[StandardRoute](throw new Exception(s"We got a timeout", a))
case e: Exception => Future.failed[StandardRoute](throw new Exception(s"We got an error", e))
}
onComplete(f) {
case Success(resp) => complete(OK, resp)
case Failure(e) =>
log.error(s"Fatal request error: $trackId / $poolId", e)
complete(InternalServerError, ErrorCodes.ErrorNotHandled)
}
}
}
}
有时,我可以看到当我同时收到大量请求时,其中一些可能会因以下消息而失败:
引起:akka.pattern.AskTimeoutException:在[8000 ms]之后询问[ActorSelection [Anchor(akka:// default /),Path(/ user / my-actor)]]的超时时间 . Sender [null]发送了类型为“my.company.messages.Request”的消息 .
问题是,如果我采取相同的请求,并尝试再次发送它,它的工作原理,有时只会发生这种情况,我不知道如何解决这个问题 .
演员确实做了很多事情,里面有很多未来,直到它给喷射路线返回一个值 .
在actor中,我创建了一个名为replyTo的val,以保持发送者的值 .
有关为什么有时我会收到此错误的任何想法?
EDIT
关于我如何管理myActor的一个例子:
class MyActor extends Actor with ActorLogging {
private implicit val timeout = Timeout(8.seconds)
def receive = {
case req: Request =>
val replyTo = sender()
doOneThing.map { one =>
doSecondThing(one).map { sec =>
replyTo ! sec
}
}
}
}
doOneThing和doSecondThing在哪里是期货......我有很多在不同情况下围绕这个演员传播 .