2017-09-03 97 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

相關問題