13

preStartフックをオーバーライドして、にメッセージを送信するとしましょうself:

Class SomeActor extends Actor {

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

  ...

}

SomeMessageそれがキューの最初のメッセージになると期待できますか?

4

1 に答える 1

31

いいえ、アクターの作成は非同期で行われるため、誰かがコンストラクターの前にメッセージをキューに入れたり、preStart実際に実行したりする可能性があります。このメッセージを確実に処理する必要がある場合は、 and を使用する必要がありbecomeますstash

self ! SomeMessage

def receive = initial

def initial: Receive = {
  case SomeMessage =>
    // do stuff
    unstashAll()
    context become initialized
  case _ => stash()
}

def initialized: Receive = {
  // your normal behavior
}

akka.actor.Stashトレイトを混ぜて、このアクターが を使用するように設定する必要がありますDequeBasedMailbox

于 2013-05-02T12:49:30.813 に答える