2017-02-02 6 views
1
import akka.actor.{ Actor, Props, Terminated } 

class WatchActor extends Actor { 
    val child = context.actorOf(Props.empty, "child") 
    context.watch(child) // <-- this is the only call needed for registration 
    var lastSender = context.system.deadLetters 

    def receive = { 
    case "kill" => 
     context.stop(child); lastSender = sender() 
    case Terminated(`child`) => lastSender ! "finished" 
    } 
} 

ここでは、Terminatedメッセージに関して混乱しています。終了メッセージの目的は何ですか

アクタが子アクタを作成するとき、デフォルトでそれを見ていないのですか? その子供の俳優が時期尚早に死亡する場合、デフォルトの戦略はそれを正しく再起動することでしょうか?

上記コードスニペットのTerminatedメッセージの目的は何ですか? (akkaウェブサイトから:http://doc.akka.io/docs/akka/2.4/scala/actors.html

子供の俳優が終了する場合、WatchActorはそのメッセージを受け取るでしょうか?しかし、lastSender()には「完了」というメッセージが送信されており、この場合はlastSenderが子アクターになりますか?

答えて

1

目的は、子の俳優が死ぬと通知を受け取ることです。 は、アッカのドキュメントに例の話、lastSenderはwatchActorにメッセージを送信した俳優である:だから

lastSender ----"kill"---> watchActor ---context.stop---> child 
       <--"finished--    <--Terminated------ 

lastSenderが殺害プロセスを委任するために「殺す」メッセージ(文字列)を送ってきた俳優であります。それはライフサイクルに加入しなければならない理由ですので、それはchildと同じではありません、そしてもう一つのキャッチwatchActor

と同じではないが中間WatchActor(「ヒットマン」のようなものだけでなく、監視)は、もともと子を作成しないかもしれないということです

val child = context.actorOf(Props.empty, "child") 
context.watch(child) 

PS:あなたがその例から見ることができるように、「子」としてという名前の俳優のこのような複雑なプロトコルの目的について私に尋ねるなら、それはOOPのような単一責任であると私は推測します。しかし、IMO、私はakkaがライフサイクルのものと元のアクターのコンセプト(IOプロトコルと状態処理)を歪めていることは決してありませんでした。しかし、これはあなたがAkkaで得たものです。ライブラリー(akka-streams、fs2、monix)をストリーミングするのがもっと簡単なので、目的に合っていれば試してみることもできます。

+0

それは本当ですが、子アクターがwatchActorによって作成された場合、context.watchを明示的に呼び出す必要はありません。それが別の俳優なら、それは私にとって意味があります。 –

+0

@coolbreezeはい、akkaのアプローチはちょっと "駄目"です、私はいくつかの小さな "P.S."それについては、しかし、塩の穀物で私の意見を取る:) – dk14

関連する問題