0

次のコードがあります。

class App1 extends App {
  val system = ActorSystem()
  val actor1 = system.actorOf(Props[Actor1])
  implicit val timeout = Timeout(5 seconds)       //1

  val future = actor1 ? "start"
  val result = Await.result(future, timeout.duration).asInstanceOf[String]
  if (result == "string1") println("yes123)
  else println("no456")
}



class Actor1 extends Actor {

  actor2 = context.actorOf(Props[Actor2])

  def receive = {
    case "start" => {
      implicit val timeout = Timeout(10 seconds)      // 2
      val future = actor2 ? "command1"                // 3
      val result = Await.result(future, timeout.duration).asInstanceOf[String]
      sender ! result                                 // 4
    }
  }
}

class Actor2 extends Actor {
  def receive = {
    case "command1" => {
      // .... some calculations
      sender ! "result123"                           //5
    }
  }
}

これは私が持っている正確なコードではなく、単純なバージョンです。質問は次のとおりです。

  1. 最初のタイムアウトは 2 番目のタイムアウトに依存しますか? もしそうなら、最初のものは2番目のものよりも小さいか、等しいか、または大きい必要がありますか?//1 and //2

  2. Actor1からの結果を待つActor2必要があります。正確に未来を使用する必要がありますか? !の代わりに使用でき?ますか?// 3 and //4

  3. 私はすべてが大丈夫であることを確認するだけです。値を送信者が想定するとおりに (を使用して)送信者//4//5返しますか?!

これは私が実際に持っているものの非常に単純なバージョンであり、ドキュメントでこれらの特定の質問に対する答えが見つからなかったため、自分でテストできないことに注意してください。

4

1 に答える 1

1
  1. akka に関する限り、2 つのタイムアウトは独立しています。ただし、以下のコメントから、actor2 の応答に 5 秒以上かかる場合、//2 のタイムアウトが長くなると //1 がタイムアウトするかどうかが懸念されているようです。そうであれば、実際に発生します。

  2. 実装しようとしているセマンティクスによって異なります。戻る前にアクター 2 にブロックさせたい場合は、await を使用する必要があります。ただし、ここでの正しい解決策は、ブロックせずに pipeTo を使用して未来を返すようです。http://doc.akka.io/docs/akka/snapshot/scala/futures.html

  3. はい、それはあなたが意図したことを行います。

于 2013-08-02T13:55:12.103 に答える