В официальном akka 2.0.4 docs говорится:
Перезапуск актера заменяет только действительный объект-актер; при перезапуске содержимое почтового ящика не изменяется, поэтому обработка сообщений будет возобновлена после возврата верхушки postRestart. Сообщение, которое вызвало исключение не будет получено повторно. Любое сообщение, отправленное актеру во время его перезапуска, будет поставлено в очередь на его почтовый ящик, как обычно.
Скажем, у меня есть сообщение, которое заставило моего актера перезапустить. Он больше не находится в почтовом ящике, поэтому он не будет обработан актером, который займет его место. Если я хочу, чтобы это сообщение было обработано актером в любом случае (если в этом случае порядок не имеет значения), было бы плохой идеей для актера отправить сообщение самому себе при перезапуске?
Некоторое (псевдо) код, чтобы показать, что я имею в виду:
class ResendingActor extends Actor {
var curMessage: Option[MyMessage] = None
def receive = {
case MyMessage(x) => {
curMessage = Some(MyMessage(x))
/* processing */
curMessage = None
}
}
override def preRestart(reason: Throwable, message: Option[Any]) {
curMessage match {
case Some(x) => self ! x
case None => ;
}
}
}
Таким образом, сообщение, которое не было обработано актером до его перезапуска, помещается в конец очереди для нового участника.
Итак, мой вопрос: Есть ли какая-то причина, по которой я не должен этого делать?
Единственное, о чем я могу думать, это то, что если сообщение по какой-то причине искажено, оно никогда не покинет систему и не приведет к перезапуску актера регулярно...