2013-04-19 27 views
6

Bir geleceğin aktörü bir istisna atarken ne olur? http://doc.akka.io/docs/akka/snapshot/scala/futures.html de Akka belgelerine göreAkka Vadeli İstisnalar

: İstisna yakalanması halinde bir Aktör veya hareket memuru Geleceği tamamladıktan ise

farketmez, Gelecek yerine geçerli bir bunu içerecektir sonuç. Bir Gelecek bir İstisna içeriyorsa, Await.result çağrısı, yeniden işlenebilmesi için yeniden atılmasına neden olacaktır.

Bu kod parçası çalıştırırken görüyorum budur emin değilim:

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) 

belgelerine göre, Await.result tekrar istisna, ama ne alıyorum olduğunu olmalıdır bir TimeoutException! Birisi bunu açıklayabilir mi?

cevap

14

Oyuncular için istisnayı ve return it as a failure status'u yakalamanız gerekir. Eğer bir zaman aşımı özel alıyoruz böylece Şimdi sen gönderene şey dönen değiliz: her zaman bir sonuç göndermek beri aktörler yok ederken

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 
     } 
    } 
    } 
} 

Vadeli, daha incelikle bu biraz işleyebilir (bu verecekti Yukarıdaki gibi aynı sonucu):

val future = Future { 
    throw new RuntimeException 
    } 
+0

Açıklama için teşekkürler. Sağladığınız bağlantı, aktörler ve gelecekler arasındaki etkileşimin açıklığa kavuşturulması konusunda da iyidir. Anlayışınıza dayanarak, bu ilişkiyi açıklığa kavuşturabilmek için yukarıdaki referanslarımın doğru olduğunu söyleyebilir miyim? – deepkimo

+0

Hayır, belgelerin daha iyi olmasını dilerim. Sorun, aktörlerin göndericiye herhangi bir şey vermeyi kabul etmemesidir, bu yüzden bir askerin tamamlanıp tamamlanmadığını asla bilemezsiniz. Daha iyi belgelendiyse ya da soranın ortadan kaldırılması ve tamamen yazılan bir gönderim aktör mekanizmasının uygulanması iyi olurdu. Türlenmemiş aktörlerin belirsizliği, yalnızca türlenmemiş ve tamamen bilinmeyen yanıt olasılıklarının belirsizliği ile daha da kötüleştirilmiştir. – Noah

+0

Bu gerekli mi? 'e atma // Başarısızlığın herhangi bir denetleyici aktörünü uyar'. Hata, bir giriş aktörü için "yanlış şifre" nedeniyle olduğunu varsayalım. Denetim otoritesine yardım eder miydi? – Jus12