13

假设我覆盖了preStart钩子并将消息发送到self

Class SomeActor extends Actor {

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

  ...

}

我可以期望这SomeMessage将是队列中的第一条消息吗?

4

1 回答 1

31

不,因为 Actor 创建是异步发生的,有人可能在构造函数或preStart实际运行之前将消息排入队列。如果您需要确保在任何其他消息之前处理此消息,那么您将需要使用becomeand 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 回答