2017-07-25 4 views
1

Ich habe dies:akka unstashAll() nicht die Nachrichten Wiedergabe

val receive = beforeLoadReceive // my default receive 

override def preStart(): Unit = { 
    doSomeLoadFromDB() 
    unstashAll() 
    context.become(connectedReceive) 
    println("I also get to here..." 
} 

def connectedReceive: Receive = { 
    case GetData => 
     println("for some reason i'm not getting to here after unstashAll why?") 
     sender() ! "this is your data" 
} 

def beforeLoadReceive: Receive = { 
    case GetData => 
     println(s"I get to here so it's stashed") 
     stash() 
} 

so bin ich mit dem stash() ich sehe ich eine Nachricht bekommen, um es so seine verstaute, auch sehe ich später, dass unstashAll() heißt aber Ich bekomme die Nachricht nicht in: connectedReceive einen Grund dafür?

Antwort

1

Ich würde empfehlen, die DB-Initialisierung zu verschieben und den Code in eine separate Message (zB InitDB) -Handler zu verschieben, da preStart() aufgerufen wird, bevor eine Nachricht verarbeitet wird. Der folgende Code funktioniert wie erwartet:

object GetData 
object InitDB 

class ReporterActor extends Actor { 
    val dbActor = context.system.actorOf(Props(new DbActor())) 

    override def preStart(): Unit = { 
    super.preStart() 
    dbActor ! GetData 
    } 

    def receive = { 
    case m: String => { 
     println("Received: " + m) 
     context.system.terminate() 
    } 
    } 
} 

class DbActor extends Actor with Stash { 
    val receive = beforeLoadReceive // my default receive 

    override def preStart(): Unit = { 
    self ! InitDB 
    } 

    def connectedReceive: Receive = { 
    case GetData => 
     println("for some reason i'm not getting to here after unstashAll why?") 
     sender() ! "this is your data" 
    } 

    def beforeLoadReceive: Receive = { 
    case InitDB => 
     // doSomeLoadFromDB() 
     Thread.sleep(5000) 
     context.become(connectedReceive) 
     unstashAll() 
     println("I also get to here...") 

    case GetData => 
     println(s"I get to here so it's stashed") 
     stash() 
    } 
} 

val as = ActorSystem() 
val actor = as.actorOf(Props(new ReporterActor())) 

Await.result(as.whenTerminated, 10.seconds) 

Ausgang:

I get to here so it's stashed 
I also get to here... 
for some reason i'm not getting to here after unstashAll why? 
Received: this is your data 
0

Dies muss geschehen, weil Ihr Schauspieler eine Giftpille erhalten hat, bevor Ihr Schauspieler wird. Im Falle einer Giftpille wird der Schauspieler die Nachricht nicht verstecken und sich einfach selbst töten.

Verwandte Themen