0

私はアクターを初めて使用し、アクターを適切にチェーンする方法を理解しようとしています。ドキュメントのAsk: Send-And-Receive-Futureセクションを読みました。

これが私が今それをした方法です

case class Message1(text : String)

class RootActor extends Actor {
  def receive: Actor.Receive = {
    case Message1(message) => {
      (context.actorOf(Props( new TestActor1)) ? message)(5.seconds) pipeTo sender
    }
  }
}

class TestActor1 extends Actor {
  def receive: Actor.Receive = {
    case message : String => {
      sender ! (message + " TestActor1")
    }
  }
}

object Test {
  def main(args: Array[String]) {
    println("Start!")

    implicit val system = ActorSystem()
    val rootActor = system.actorOf(Props( new RootActor))

    for (reply1 <- (rootActor ? Message1("Begin"))(5.seconds).mapTo[String])
      println(reply1)
  }
}

だから私は手動で返信をリレーします。しかし、子アクターからの応答は自動的にその親にバブルアップされるべきではありませんか? これは正しい方法ですか?

askまた、タイムアウトを必要とする返信を手動でバブルアップする方法を使用していることも懸念しています。しかし、一部の子アクターが他の子アクターよりも多くの時間を必要としているのに、ルート アクターにメッセージを送信するときに 1 つのタイムアウト値に制限されている場合はどうなるでしょうか? チェーン全体で適切なタイムアウトを維持するのは非常に面倒だと思います。

どうすれば簡単にできますか?

4

1 に答える 1

5

forward代わりに使用してください。それが目的です。次のように使用します。

context.actorOf(Props( new TestActor1)).forward(message)
于 2013-09-30T20:27:27.160 に答える