Подтвердить что ты не робот

Akka - отправка сообщения об ошибке

В официальном 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 => ;
    }
  }
}

Таким образом, сообщение, которое не было обработано актером до его перезапуска, помещается в конец очереди для нового участника.

Итак, мой вопрос: Есть ли какая-то причина, по которой я не должен этого делать?

Единственное, о чем я могу думать, это то, что если сообщение по какой-то причине искажено, оно никогда не покинет систему и не приведет к перезапуску актера регулярно...

4b9b3361

Ответ 1

Вы уже получили сообщение об ошибке в preRestart (см. сообщение: Опция [Любой]), поэтому вам не нужно откладывать это. И да, это прекрасно, чтобы переслать его самому себе, но остерегайтесь бесконечных перезапусков в сочетании с этим, так как вы, скорее всего, получите сообщение, которое никогда не будет отброшено.