2017-09-03 6 views
0

REST API에 akka-http를 사용하고 AccountActors에 akka 액터를 사용하여 통화 거래 시스템을 구축하려고합니다.AskTimeoutException : [5000 ms] 후에 시간 초과 요청

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 호출마다, 그것은 성공이다 배우가 죽거나 셧다운 된 것 같아요? (ask)는 메시지가 receive 메소드에 도달하지 않기 때문에 액터를 찾지 않습니다. 요청 전화를 다른 것으로해야합니까? 선물을 다루는

+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

올바른 지침은 예를 들어, 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) 
    } 
    } 
} 

자세한 내용 onComplete입니다.

+0

감사합니다 @Stefano Bonetti - 이전에 시도했지만 여전히 작동하지 않았습니다. 문제는 두 번째 호출에서 작동하지 않는다는 것입니다. 첫 번째 API 호출 후 배우가 사용 중지 된 것 같습니다. – boseAbhishek

+0

포인터가 더 있습니까? – boseAbhishek