2017-09-03 89 views
0

我正在尝试使用akka-http为AccountActors的REST API和akka actors创建一个货币交易系统。AskTimeoutException:询问[5000毫秒]后超时

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

'fromAcc? DebitAccount(req.tranferAmount)'创建一个'Future',但它看起来并不像你对这个'Future'做任何事情。当BankActor发送DebitAccount消息时,您希望从'fromAcc'演员返回什么样的消息? – chunjef

+0

一切正常,我得到预期的答案**,但只有一次** - 然后我不得不重新启动服务器再次拨打电话,它工作正常。我认为演员死亡,只有在服务器重新启动后才开始...... – boseAbhishek

+0

尝试更换'fromAcc? DebitAccount(req.tranferAmount)'with'fromAcc! DebitAccount(req.tranferAmount)'。 – chunjef

回答

0

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

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) 
    } 
    } 
} 

更多细节。

+0

谢谢@Stefano Bonetti - 我早些时候尝试过,但仍然无效。问题是它不适用于第二个电话。似乎演员在第一次API调用后被禁用! – boseAbhishek

+0

更多指针? – boseAbhishek