1

スーパーバイザーとして機能するアクターがありますが、これがアクターであるかどうかに関係なく、呼び出し元にデータを「返す」必要もあります。

私はスーパーバイザーに尋ねています。彼を SV と呼びましょう。

SV 私が彼に送ったメッセージを処理し、応答を返します。

val system = ActorSystem("ActorSystem")
val sv = system.actorOf(Props[SV], name = "SV")

sv ? msg

そして、SV の受信メソッドは次のようになります。

def receive = {
    case msg => (someChild ? msg).pipeTo(sender)
    ...
}

これはすべてうまくいきます。問題は、子が例外をスローしたときです。この例外はスーパーバイザー戦略によってキャッチされます。

override def supervisorStrategy = OneForOneStrategy () {
    case e : Throwable => {
        val newResponse = someNewResponse
        sender ! newResponse
        ...
    }
}

送信者は、そもそも SV を呼び出した人への参照ではなくなりました。メッセージを依頼者に送り返し、元の流れに戻る方法がわかりません。

4

2 に答える 2

1

スーパーバイザー戦略と例外を使用して、フローまたはデータを制御していますか? 子アクターの「例外」の場合に型システム (応答Optionの type または a )を使用し、例外なしで応答フローを処理することを検討してください。FailureFuture

スーパーバイザー戦略は、未処理の例外用です。未処理の例外が発生すると、送信者にメッセージで応答できなくなります。ローランド・クーンが提案するように、未処理の例外で送信者をラップしない限り。

代わりに、スーパバイザ ストラテジが、ハンドルされていない例外をDirective.

于 2015-12-09T10:55:21.887 に答える