2012-04-10 3 views
6

내가 스칼라와 Akka 간단한 P2P 모델링하고있어 함께 "기다리고 있습니다"를 "요청"과 : 다음Akka 배우 TimeoutException

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

출력을하는 I

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) 

나는의 문서를 따랐다 : M 점점처럼 항상 이다 ' 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! –

관련 문제