2013-04-19 23 views
6

Co dzieje się, gdy aktor przyszłości rzuca wyjątek?Wyjątki Akka Futures Wyjątki

Zgodnie z dokumentacją Akka w http://doc.akka.io/docs/akka/snapshot/scala/futures.html:

to nie ma znaczenia, jeśli aktor lub dyspozytor jest ukończenie przyszłości, jeśli wyjątek zostanie złapany przyszłości będzie zawierać zamiast ważnego wynik. Jeśli Przyszłość zawiera wyjątek, wywołanie Await.result spowoduje, że zostanie ono ponownie wygenerowane, aby można było poprawnie obsłużyć tę poprawkę.

nie jestem pewien, że to, co widzę, gdy uruchomiony ten kawałek kodu:

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) 

Zgodnie z dokumentacją, Await.result powinny rzucać wyjątek ponownie, ale co ja dostaję to wyjątek TimeoutException! Czy ktoś może to wyjaśnić?

Odpowiedz

14

Dla aktorów, którzy muszą złapać wyjątek i return it as a failure status. Teraz nie masz nic powrotem do nadawcy, więc dostajesz wyjątek 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 może obsłużyć to trochę bardziej bezpiecznie, ponieważ zawsze wysłać wynik, a aktorzy nie (byłoby to dać masz taki sam wynik jak powyżej):

val future = Future { 
    throw new RuntimeException 
    } 
+0

Dzięki za wyjaśnienia. Podany link jest również dobry w wyjaśnianiu interakcji między aktorami i przyszłością. Zastanawiam się, czy w oparciu o twoje zrozumienie powyższe odniesienie do przyszłości jest wystarczająco dokładne, aby wyjaśnić tę relację? – deepkimo

+0

Nie, szkoda, że ​​dokumentacja nie była lepsza. Problem polega na tym, że aktorzy nie są zobowiązani do zwracania czegokolwiek do nadawcy, więc nigdy nie wiesz, czy pytanie powinno zostać wypełnione. Byłoby miło, gdyby to zostało udokumentowane lepiej, lub gdyby prośby zostały po prostu wyeliminowane i zaimplementowano w pełni wypisany mechanizm wysyłania aktora. Niejednoznaczność aktorów jest znacznie pogorszona przez niejednoznaczność nieznanych i całkowicie nieznanych możliwości odpowiedzi. – Noah

+0

Czy to konieczne? 'throw e // Alert dowolnego przełożonego aktora awarii'. Załóżmy, że błąd wynika z "niepoprawnego hasła" dla aktora logowania. Czy rzuciłbyś pomoc opiekunowi? – Jus12