AskTimeoutException:在[5000 ms]之后询问超时

时间:2017-09-03 09:54:16

标签: rest akka actor akka-http

我正在尝试使用针对REST API的akka​​-http和针对AccountActors的akka​​ actor构建一个货币交易系统。

post {
  (path("accounts" / "move-money") & entity(as[MoveMoneyRequest])) { moveMoneyRequest =>

    complete(
      (bankActor ? moveMoneyRequest).map(x => MoveMoneyResponse("Money Transfer Successful!"))
    )
  }
}

bankActor是在主应用程序中创建的

 val bankActor = mainActorSystem.actorOf(Props(classOf[BankingActor], accountService), name = "bankActor")

在BankActor内部,我们有:

     def receive: Receive = LoggingReceive {
    case req: MoveMoneyRequest =>
      val fromAcc = createAccountActor(Some(req.fromAccount))
      val toAcc = createAccountActor(Some(req.toAccount))

      fromAcc ? DebitAccount(req.tranferAmount)
      become(awaitFrom(fromAcc, toAcc, req.tranferAmount, sender))

  }


 private def createAccountActor(accountNum: Option[String]): ActorRef = {
    actorOf(Props(classOf[AccountActor], accountNum, accountService))
  }

问题:现在,对于每次第一次API调用,它都很成功,但似乎演员死了/关闭了? (问)没有找到演员,因为消息没有到达接收方法。我是否需要使提问不同?

1 个答案:

答案 0 :(得分:0)

处理期货的正确指令是onComplete,例如

 post {
  (path("accounts" / "move-money") & entity(as[MoveMoneyRequest])) { moveMoneyRequest =>

    val fut = (bankActor ? moveMoneyRequest).map(x => MoveMoneyResponse("Money Transfer Successful!"))

    onComplete(fut){
      case util.Success(_) => complete(StatusCodes.OK)
      case util.Failure(ex) => complete(StatusCodes.InternalServerError)
    }
  }
}

docs

中的更多详细信息
相关问题