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. 第一个超时是否取决于第二个?如果是这样,第一个必须小于、等于还是大于第二个?//1 and //2

  2. 应该Actor1等待来自的结果Actor2,它应该使用future吗?可以用!代替?吗?// 3 and //4

  3. 我只是为了确保一切正常。按照他们//4//5设想(使用!)将值返回给发件人?

请注意,我无法自己测试它,因为这是我实际拥有的非常简单的版本,而且我没有在文档中找到这些特定问题的答案。

4

1 回答 1

1
  1. 就 akka 而言,这两个超时是独立的。但是,从下面的评论来看,您似乎担心的是,如果 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 回答