2013-04-19 14 views
6

Cosa succede quando un attore di un futuro lancia un'eccezione?Akka Futures Exceptions

Secondo la documentazione Akka a http://doc.akka.io/docs/akka/snapshot/scala/futures.html:

Non importa se un attore o dello speditore sta completando l' futuro, se un'eccezione e 'colto in futuro conterrà invece di una valida risultato. Se un Futuro contiene un'eccezione, chiamando il numero Await.result verrà generato nuovamente in modo che possa essere gestito correttamente .

io non sono sicuro che questo è quello che sto vedendo durante l'esecuzione di questo pezzo di codice:

class Worker extends Actor { 
    def receive = { 
     case i: Int => throw new RuntimeException 
    }   
    } 

    implicit val system = ActorSystem("MySystem") 
    val worker = system.actorOf(Props(new Worker), name="worker") 
    implicit val timeout = Timeout(5 minutes) 
    val future = worker ? 0 
    val res = Await.result(future, 10 seconds) 

In base alla documentazione, Await.result dovrebbe lanciare di nuovo l'eccezione, ma quello che sto ottenendo è un timeoutException! Qualcuno può chiarire su questo?

risposta

14

Per gli attori è necessario rilevare l'eccezione e return it as a failure status. In questo momento non si sta tornando nulla al mittente in modo che stai ricevendo un'eccezione timeout:

class Worker extends Actor { 
    def receive = { 
    case i: Int => { 
     try { 
     throw new RuntimeException 
     sender ! "Some good result" 
     } catch { 
     case e: Exception => 
      sender ! akka.actor.Status.Failure(e) // Alert the sender of the failure 
      throw e // Alert any supervisor actor of the failure 
     } 
    } 
    } 
} 

Futures in grado di gestire questo un po 'più con garbo dal mandano sempre un risultato, mentre gli attori non lo fanno (questo darebbe lo stesso risultato di cui sopra):

val future = Future { 
    throw new RuntimeException 
    } 
+0

Grazie per il chiarimento. Il link che hai fornito è anche utile per chiarire l'interazione tra attori e futuro. Mi chiedo, basandomi sulla tua comprensione, trovi il mio riferimento sopra al futuro abbastanza preciso nel chiarire questa relazione? – deepkimo

+0

No, vorrei che la documentazione fosse migliore. Il problema è che non si presume che gli attori restituiscano qualcosa al mittente, quindi non si sa mai se una domanda dovrebbe essere completata. Sarebbe bello se questo fosse meglio documentato, o se le domande fossero state appena eliminate e fosse stato implementato un meccanismo di ricezione degli invii completamente digitato. L'ambiguità degli attori non tipizzati è solo aggravata dall'ambiguità delle possibilità di risposta non tipizzate e completamente sconosciute. – Noah

+0

È necessario? 'throw e // Avvisa qualsiasi attore supervisore dell'errore'. Supponiamo che l'errore sia dovuto a "password errata" per un attore di accesso. Avrebbe aiutato il supervisore? – Jus12