Akka演员问模式不能按预期工作

时间:2015-08-16 19:42:59

标签: scala akka

演员B包含对名为senderr的演员A的引用。演员A ask的演员B,等待响应并打印出来。但它没有收到回应。为什么?它必须在控制台打印4号,但它没有。

class A(b: ActorRef) extends Actor {

  private implicit val timeout = Timeout(20 seconds)

  b ! 1

  def receive = {
    case 2 => (b ? 3).map(println)
  }
}

class B extends Actor {

  var senderr : ActorRef = null

  def receive = {
    case 1 =>
      senderr = sender()
      sender ! 2
    case 3 =>
      senderr ! 4
  }
}

object Main extends App {
  val system = ActorSystem("test")
  val b = system.actorOf(Props[B])
  val a = system.actorOf(Props(classOf[A], b))
}

1 个答案:

答案 0 :(得分:1)

ask基本上创建了一个临时微行动者,其唯一目的是接收Any类型的一个回复

B收到3时,它会4senderr发送A。但A4不匹配。要让(b ? 3).map(println)收到4B必须将其发送到sender()ask当时指的是case 3 => sender ! 4 设置的临时演员:

case 4

或者,您可以在A中拥有ask,但之后您甚至不需要使用class Person { constructor(name) { this.name_ = name; } get name() { return this.name_; } }