2013-04-19 11 views
6

未来の俳優が例外をスローするとどうなりますか?Akka先物の例外

http://doc.akka.io/docs/akka/snapshot/scala/futures.htmlでアッカのドキュメントによると:

俳優やディスパッチャが 未来を完了した場合、例外がキャッチされた場合、今後の代わりに有効なの を、それが含まれていますそれは問題ではありません結果。未来に例外が含まれている場合は、 を呼び出すとAwait.resultが再びスローされ、 を正しく処理できるようになります。

私は、これはコードのこの部分を実行しているときに私は見ています何であるかわからない:

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) 

文書によると、Await.resultは再び例外をスローしますが、私が取得していますことはあるはずですTimeoutException!誰かがこれを明確にすることはできますか?

答えて

14

俳優の場合、例外をキャッチする必要があります。return it as a failure status。あなたはタイムアウト例外を取得しているので、今、あなたは、送信者には何も戻っていない:俳優は(これは与えるだろうしませんが、彼らは常に、結果を送信するので

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

先物はもう少し優雅にこれを処理することができます上記の結果と同じです):

val future = Future { 
    throw new RuntimeException 
    } 
+0

ご清聴ありがとうございます。あなたが提供したリンクは、俳優と未来の相互関係を明確にするのにも役立ちます。私は、あなたの理解に基づいて、この関係を明確にするのに十分正確な先物についての私の上記参照を見つけるのだろうか? – deepkimo

+0

いいえ、私はドキュメントがよかったと思います。問題は、アクターが送信者に何かを返すとは仮定されていないため、質問が完了するかどうかは決して分かりません。これがうまく文書化されたか、または質問がちょうど取り除かれ、完全に型付けされた送信受信アクターの仕組みが実装されていれば、それは素晴らしいことでしょう。タイプのない俳優のあいまいさは、タイプのない、全く知られていない応答の可能性のあいまいさによってさらに悪化する。 – Noah

+0

これは必要ですか? 'throw e //失敗の監督者を警告する'。エラーがログイン・アクターの「誤ったパスワード」によるものとします。スーパーバイザーに助けを借りるでしょうか? – Jus12

関連する問題