preStart hook:向actor本身发送的消息

tok*_*rev 9 scala akka

假设我重写了preStart钩子并发送消息给self:

Class SomeActor extends Actor {

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

  ...

}
Run Code Online (Sandbox Code Playgroud)

我能指望这SomeMessage将成为队列中的第一条消息吗?

Rol*_*uhn 28

不,因为actor创建是异步发生的,所以有人可能在构造函数之前将消息排队或preStart实际运行.如果您需要确保在任何其他消息之前处理此消息,那么您将需要使用becomestash:

self ! SomeMessage

def receive = initial

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

def initialized: Receive = {
  // your normal behavior
}
Run Code Online (Sandbox Code Playgroud)

您需要混合akka.actor.Stash特征并配置此actor以使用a DequeBasedMailbox.