2014-12-18 2 views
3

Futures 및 Akka 감독자를 사용하여 응용 프로그램을 개발하려고하지만 미래에 Failure를 배우에게 반환 할 때 감독자가 예외를 얻지 못합니다.Akka supervisor catch future 실패

여기 내 코드가 있습니다.

1) 감독자 배우

class TransaccionActorSupervisor() extends Actor with ActorLogging { 

    val actor: ActorRef = context.actorOf(Props[TransaccionActor].withRouter(RoundRobinPool(nrOfInstances = 5)), "transaccion-actor") 

    def receive = { 
    case msg: Any => actor forward msg 
    } 

    override val supervisorStrategy = OneForOneStrategy() { 
    case exception => 
     println("<<<<<<<<<<<<<<<<<<< IN SUPERVISOR >>>>>>>>>>>>>>>>>>>>>>>>>>>>") 
     Restart 
    } 

} 

감독 배우 내가 잘못 뭐하는 거지

Class TransaccionActor() extends Actor with ActorLogging { 

    implicit val _: ExecutionContext = context.dispatcher 
    val transaccionAdapter = (new TransaccionComponentImpl with TransaccionRepositoryComponentImpl).adapter 

    def receive = { 

    case msg: GetTransaccionById => 
     val currentSender: ActorRef = sender() 
     transaccionAdapter.searchTransaction(msg.id).onComplete { 
     case Success(transaction) => currentSender ! transaction 
     case Failure(error) => throw error 
     } 

    } 

?

대단히 고마워요!

답변

0

액터 내에서 앞으로 던져 질 예외는 액터에 의해 포착되지 않습니다. 예외를 self으로 파이프 한 다음 감독 액터가 처리하도록하려면 다시 처리해야합니다.

+1

. 답을 코드 스 니펫으로 자세히 설명해 주시겠습니까? –

3

나는 동일한 문제가 있었고 Ryan의 대답이 도움이되었습니다. 그러나 Akka를 처음 접했기 때문에 대답을 이해하는 것이 쉽지 않았으므로 몇 가지 세부 사항을 제공하고자합니다.

먼저 onComplete은 전혀 작동하지 않을 것이라고 생각합니다. 완전히 별도의 스레드에서 호출 할 수있는 콜백 함수를 등록하고 새로운 Future을 반환하지 않습니다. 따라서 onComplete에 던져진 예외는 모두 사라집니다.

대신, 그들은 새로운 Future의를 반환으로 map, recover, recoverWith 또는 transform을 사용하는 것이 좋습니다. 그런 다음 결과를 액터로 파이프해야합니다. self; 받는 액터는 파이프 된 결과를 처리하고 예외를 다시 발생시켜야합니다.

즉 관리 대상 배우가 다음과 같이한다 : 나는이 같은 문제로 어려움을 겪고있어

import akka.pattern.pipe 
import akka.actor.Status.Failure 
import akka.actor.Actor 

class TransaccionActor() extends Actor with ActorLogging { 

    import context.dispatcher 

    val transaccionAdapter = 
    (new TransaccionComponentImpl with TransaccionRepositoryComponentImpl).adapter 

    def receive = { 

    case msg: GetTransaccionById => 
     val currentSender: ActorRef = sender() 
     transaccionAdapter searchTransaction msg.id map { transaction => 
     currentSender ! transaction 
     } pipeTo self 

    case Failure(throwable) => throw throwable 

    } 

} 
+1

이것은 지금 당장 직면했던 똑같은 문제였습니다. 고맙습니다 – daydreamer