2013-04-19 34 views
6

Điều gì sẽ xảy ra khi một diễn viên của tương lai ném một ngoại lệ?Ngoại lệ tương lai của Akka

Theo tài liệu Akka tại http://doc.akka.io/docs/akka/snapshot/scala/futures.html:

Nó không quan trọng nếu một diễn viên hoặc điều phối được hoàn thành tương lai, nếu một ngoại lệ được bắt được trong tương lai sẽ chứa nó thay vì của một hợp lệ kết quả. Nếu một tương lai có chứa một ngoại lệ, gọi Await.result sẽ khiến nó bị ném trở lại để nó có thể được xử lý đúng cách.

Tôi không chắc chắn đây là những gì tôi nhìn thấy khi chạy đoạn mã này:

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) 

Theo tài liệu, Await.result nên ném ngoại lệ một lần nữa, nhưng những gì tôi nhận được là một TimeoutException! Ai đó có thể làm rõ về điều này?

Trả lời

14

Đối với diễn viên, bạn cần phải nắm bắt ngoại lệ và return it as a failure status. Ngay bây giờ bạn không trở về bất cứ điều gì cho người gửi, do đó bạn sẽ nhận được một ngoại lệ 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 có thể xử lý này một chút duyên dáng hơn vì họ luôn gửi Kết quả là, trong khi diễn viên không (điều này sẽ cung cấp cho bạn cùng kết quả như trên):

val future = Future { 
    throw new RuntimeException 
    } 
+0

Cảm ơn bạn đã giải thích rõ. Liên kết bạn cung cấp cũng rất tốt trong việc làm rõ sự tương tác giữa các diễn viên và tương lai. Tôi tự hỏi, dựa trên sự hiểu biết của bạn, bạn có thấy tài liệu tham khảo trên của tôi về tương lai đủ chính xác trong việc làm rõ mối quan hệ này không? – deepkimo

+0

Không, tôi muốn tài liệu hướng dẫn tốt hơn. Vấn đề là các diễn viên không được giả định trả lại bất cứ điều gì cho người gửi, vì vậy bạn không bao giờ biết nếu một yêu cầu hoàn thành. Nó sẽ được tốt đẹp nếu điều này đã được tài liệu tốt hơn, hoặc nếu yêu cầu chỉ được loại bỏ và gửi đầy đủ gửi nhận được cơ chế diễn viên đã được thực hiện. Sự mơ hồ trong các diễn viên không rõ ràng chỉ trở nên tồi tệ hơn bởi sự mơ hồ của các khả năng đáp ứng không rõ ràng và hoàn toàn không rõ. – Noah

+0

Điều này có cần thiết không? 'throw e // Thông báo cho bất kỳ người giám sát nào về sự thất bại'. Giả sử lỗi là do "mật khẩu không chính xác" cho một diễn viên đăng nhập. Sẽ ném giúp người giám sát? – Jus12

Các vấn đề liên quan