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ć?
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
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
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