2017-07-25 48 views
1

我有这个不是重播的消息:阿卡unstashAll()

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

所以我使用的stash()我看到,我得到一个消息,有这样的藏,我也看到事后说unstashAll()的调用,但我不明白:connectedReceive的任何原因?

回答

1

我建议在处理任何消息之前调用preStart()方法来调用DB初始化和取消/成为代码到单独的消息(如InitDB)处理程序。如预期以下作品的代码:

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) 

输出:

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

这一定是因为你的演员在你的演员变成connectedReceive之前收到毒丸。 如果有毒丸,演员将不会隐藏信息,并会简单地杀死自己。