2012-04-10 9 views
6

で "待つ" を "聞いて" と「取得mは常によう次のとおりです。私はのマニュアルを参照して続いているアッカ俳優は、私はスカラ座やアッカとシンプルなP2Pをモデル化していますTimeoutException

registering [Actor[akka://p2p/user/c1]] for [[email protected]] 
registering [Actor[akka://p2p/user/c2]] for [[email protected]] 
registering [Actor[akka://p2p/user/c3]] for [[email protected]] 
registering [Actor[akka://p2p/user/c4]] for [[email protected]] 
[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リファレンスドキュメントのAwait.readyAwait.resultに交換しても効果はありません。ログには、最後の登録が成功したことが示されます。

これはどのように修正する必要がありますか?

答えて

8

ノードアクタからメッセージが返されるのを待っていますが、ノードアクタはsender actorRefにメッセージを返さないため、s1 ? _registerによって作成された未来[Any]は決して応答を受信しないため、未来は決して完全ではありません。ノードreceiveメソッドの中からsender ! somethingを追加して応答を送信することができます。この場合、somethingが意味をなさないものはありますか。

+1

ありがとうございました、それは間違ったミスでした! '送信者!誰も私のために働くだろう。 – nobeh

8

シチューのは右のそれを得たが、あなたはあなたのネットワークの俳優でいくつか気になるコードを持っている:

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") 

は、なぜあなたは新しいActorSystemを作成している、そしてなぜあなたはその俳優のシステム内のトップレベルの役者を作成しています?

あなたが俳優のシステムへのアクセスが必要な場合は、簡単なコール:

context.system 

そして、あなたは、あなたがルートを乱雑にはならないのと同じ理由のために、トップレベルの役者「という理由だけで」を作成しないでくださいすべてのファイルをそこに置くことによって、ファイルシステムの ばかりか、ネットワークに子供俳優を作成するには:それはトップを作成しようとして

context.actorOf(...) 

今あなたが、できるだけ早くあなたが同じシステムに複数のネットワーク・俳優を作成するなどの問題があるでしょう同じ名前のレベルの俳優。

+1

明確なヒントをありがとう。 – nobeh

+1

大歓迎です。ハッピーhAkking! –

関連する問題