Где ставятся сообщения go после остановки актера? Akka - PullRequest
1 голос
/ 05 мая 2020

Итак, я понимаю, что если вы отправляете сообщение мертвому актеру, оно попадает в DeadLetters, но что происходит с сообщениями, которые уже были поставлены в очередь для этого актера. Их тоже туда переправляют или они теряются?

1 Ответ

3 голосов
/ 06 мая 2020

В общем, насчет доставки мертвых писем многого нельзя. Как сказано в документах по мертвым письмам: :

Сообщения, которые не могут быть доставлены (и для которых это может быть установлено), будут доставлены синтетическому c актеру с именем /deadLetters. Эта доставка осуществляется по принципу «максимальных усилий»; он может выйти из строя даже в локальной JVM (например, при завершении работы актора). Сообщения, отправленные через ненадежные сетевые транспорты, будут потеряны, не оказавшись мертвыми буквами.

Однако похоже, что Akka пытается пересылать в мертвые письма сообщения, которые уже были поставлены в очередь для актера. Это отрывок из функции cleanup для Mailbox, которая вызывается после завершения работы актера:

  /**
   * Overridable callback to clean up the mailbox,
   * called when an actor is unregistered.
   * By default it dequeues all system messages + messages and ships them to the owning actors' systems' DeadLetterMailbox
   */
  protected[dispatch] def cleanUp(): Unit =
    if (actor ne null) { // actor is null for the deadLetterMailbox
      val dlm = actor.dispatcher.mailboxes.deadLetterMailbox
      var messageList = systemDrain(new LatestFirstSystemMessageList(NoMessage))
      while (messageList.nonEmpty) {
        // message must be “virgin” before being able to systemEnqueue again
        val msg = messageList.head
        messageList = messageList.tail
        msg.unlink()
        dlm.systemEnqueue(actor.self, msg)
      }

      if (messageQueue ne null) // needed for CallingThreadDispatcher, which never calls Mailbox.run()
        messageQueue.cleanUp(actor.self, actor.dispatcher.mailboxes.deadLetterMailbox.messageQueue)
    }
}
...