scala – Akka Actor使用TimeoutException“询问”和“等待”
发布时间:2020-12-16 19:12:11 所属栏目:安全 来源:网络整理
导读:我正在用 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 + "]") pe
我正在用
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") } } 我得到的输出总是如下: registering [Actor[akka://p2p/user/c1]] for [nl.cwi.crisp.examples.p2p.scala.Node@14b5f4a] registering [Actor[akka://p2p/user/c2]] for [nl.cwi.crisp.examples.p2p.scala.Node@14b5f4a] registering [Actor[akka://p2p/user/c3]] for [nl.cwi.crisp.examples.p2p.scala.Node@14b5f4a] registering [Actor[akka://p2p/user/c4]] for [nl.cwi.crisp.examples.p2p.scala.Node@13c0b53] [ERROR] [04/10/2012 22:07:04.34] [main-akka.actor.default-dispatcher-1] [akka://main/user/p2p] error while creating actor java.util.concurrent.TimeoutException: Futures timed out after [5000] milliseconds at akka.dispatch.DefaultPromise.ready(Future.scala:834) at akka.dispatch.DefaultPromise.ready(Future.scala:811) at akka.dispatch.Await$.ready(Future.scala:64) at nl.cwi.crisp.examples.p2p.scala.Network.<init>(Node.scala:136) at nl.cwi.crisp.examples.p2p.scala.Main$$anonfun$11.apply(Node.scala:164) at nl.cwi.crisp.examples.p2p.scala.Main$$anonfun$11.apply(Node.scala:164) at akka.actor.ActorCell.newActor(ActorCell.scala:488) at akka.actor.ActorCell.create$1(ActorCell.scala:506) at akka.actor.ActorCell.systemInvoke(ActorCell.scala:591) at akka.dispatch.Mailbox.processAllSystemMessages(Mailbox.scala:191) at akka.dispatch.Mailbox.run(Mailbox.scala:160) at akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(AbstractDispatcher.scala:505) at akka.jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:259) at akka.jsr166y.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:997) at akka.jsr166y.ForkJoinPool.runWorker(ForkJoinPool.java:1495) at akka.jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104) 我在Akka参考文档中遵循了Futures的文档.与Await.result交换Await.ready没有任何影响.日志显示上次注册成功. 我该怎么解决这个问题? 解决方法
您正在等待从Node actor返回的消息,但Node actor不会将消息发送回发送方actorRef,因此由[1]创建的Future [Any]? _register永远不会收到回复,因此Future永远不会完整.你可以添加发件人!来自Node内部的东西接收方法来发送响应,我不确定在这种情况下什么是有意义的.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |