2017-07-25 7 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になる前に毒の丸薬を受け取ったので、これは起こっているに違いありません。 毒薬の場合、俳優はメッセージを隠さず、単純に自分自身を殺すでしょう。

関連する問題