Scala 阿克卡演员“;询问;及;等待“;带有TimeoutException

Scala 阿克卡演员“;询问;及;等待“;带有TimeoutException,scala,actor,akka,Scala,Actor,Akka,我正在用Scala和Akka对一个简单的P2P进行建模: class Node() extends Peer with Actor { var peers: List[ActorRef] = List() def receive = { case _register(peer: ActorRef, p: Option[Int]) => { println("registering [" + peer + "] for [" + this + "]")

我正在用Scala和Akka对一个简单的P2P进行建模:

class Node() extends Peer with Actor {

  var peers: List[ActorRef] = List()

  def receive = {
    case _register(peer: ActorRef, p: Option[Int]) => {
      println("registering [" + peer + "] for [" + this + "]")
      peers = peer :: peers
    }
  }

}

sealed case class _register(val peer: ActorRef, var p: Option[Int] = None)
然后是一个简单的网络:

class Network() extends Actor {

  def this(name: String) = {

    this()

    val system = ActorSystem(name)

    val s1 = system.actorOf(Props(new Node()), name = "s1")
    val s2 = system.actorOf(Props(new Node()), name = "s2")

    val c1 = system.actorOf(Props(new Node()), name = "c1")
    val c2 = system.actorOf(Props(new Node()), name = "c2")
    val c3 = system.actorOf(Props(new Node()), name = "c3")
    val c4 = system.actorOf(Props(new Node()), name = "c4")

    implicit val timeout = Timeout(5 second)

    s1 ? _register(c1)
    s1 ? _register(c2)
    s1 ? _register(c3)
    val lastRegistered = s2 ? _register(c4)
    Await.ready(lastRegistered, timeout.duration)

    println("initialized nodes")
  }
}
我得到的输出总是这样:

注册[Actor][akka://p2p/user/c1]]对于[nl.cwi.crisp.examples.p2p.scala]。Node@14b5f4a]
注册[演员][akka://p2p/user/c2]]对于[nl.cwi.crisp.examples.p2p.scala]。Node@14b5f4a]
注册[演员][akka://p2p/user/c3]]对于[nl.cwi.crisp.examples.p2p.scala]。Node@14b5f4a]
注册[演员][akka://p2p/user/c4]]对于[nl.cwi.crisp.examples.p2p.scala]。Node@13c0b53]
[错误][04/10/2012 22:07:04.34][main akka.actor.default-dispatcher-1][akka://main/user/p2p]创建参与者时出错
java.util.concurrent.TimeoutException:Futures在[5000]毫秒后超时
在akka.dispatch.DefaultPromise.ready(Future.scala:834)
在akka.dispatch.DefaultPromise.ready(Future.scala:811)
在akka.dispatch.wait$.ready(Future.scala:64)
位于nl.cwi.crisp.examples.p2p.scala.Network.(Node.scala:136)
位于nl.cwi.crisp.examples.p2p.scala.Main$$anonfun$11.apply(Node.scala:164)
位于nl.cwi.crisp.examples.p2p.scala.Main$$anonfun$11.apply(Node.scala:164)
在akka.actor.ActorCell.newActor(ActorCell.scala:488)
在akka.actor.ActorCell.create$1(ActorCell.scala:506)
位于akka.actor.ActorCell.systemInvoke(ActorCell.scala:591)
在akka.dispatch.Mailbox.processAllSystemMessages上(Mailbox.scala:191)
在akka.dispatch.Mailbox.run(Mailbox.scala:160)
在akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(AbstractDispatcher.scala:505)
在akka.jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:259)
位于akka.jsr166y.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:997)
位于akka.jsr166y.ForkJoinPool.runWorker(ForkJoinPool.java:1495)
在akka.jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104)
我遵循了Akka参考文档上的文档。将
wait.ready
wait.result
交换不会产生任何效果。日志显示上次注册已成功


我该如何解决此问题?

您正在等待节点参与者返回消息,但节点参与者没有将消息发送回发送者
actorRef,因此
s1创建的未来[Any]是什么_register
将永远不会收到响应,因此未来将永远不会完成。您可以添加
发件人!从节点内部的某个
接收
方法发送响应,我不确定在这种情况下什么是某个有意义。

斯图说得对,但你的网络参与者中有一些令人担忧的代码:

val system = ActorSystem(name)

val s1 = system.actorOf(Props(new Node()), name = "s1")
val s2 = system.actorOf(Props(new Node()), name = "s2")

val c1 = system.actorOf(Props(new Node()), name = "c1")
val c2 = system.actorOf(Props(new Node()), name = "c2")
val c3 = system.actorOf(Props(new Node()), name = "c3")
val c4 = system.actorOf(Props(new Node()), name = "c4")
为什么要创建一个新的actor系统,为什么要在actor系统中创建顶级的actor

如果需要访问参与者的系统,只需调用:

context.system
您应该避免“仅仅因为”而创建顶级参与者,同样的原因是您不应该将所有文件放在文件系统的根目录中,从而使文件系统变得混乱。 要创建网络的子参与者,只需执行以下操作:

context.actorOf(...)

现在,只要在同一系统中创建多个网络参与者,就会出现问题,因为它将尝试创建同名的顶级参与者。

谢谢,这是一个草率的错误<代码>发件人!没有一个适合我。
context.actorOf(...)