это против себя внутри класса актеров akka

Допустим, у меня есть очень простой класс актера, который получает любое сообщение и выводит его на консоль.

  class SimpleActor extends Actor{

    def receive: Receive = {
      case message =>
        println(s"[${this}][${self}] received message: ${message}")
    }
  }

  val simpleActor = actorSystem.actorOf(Props[SimpleActor], "simpleActor")
  simpleActor ! "Hey"

Как видите, здесь я использую как this, так и self, и оба имеют разные значения. Его вывод выглядит примерно так:

[pkg.ActorRunner$SimpleActor@65cca69][Actor[akka://ActorDemo/user/simpleActor#934141660]] received message: Hey

Я хочу понять разницу между self и this, потому что в сложных сценариях (производственная система), если актор ломается, например: выдает исключение, я думаю, что значение для this изменяется.


person Manoj Sehrawat    schedule 15.03.2019    source источник


Ответы (1)


this — это классическая ссылка Java на объект, расширяющий черту Actor, а self — ссылка на ActorRef, который вам нужен для отправки сообщений (! или tell и ? или ask)

  • Вы не можете отправлять сообщения на this
  • Вы не должны передавать ссылку на this внешнему актору, в то время как передача ссылки на self вполне допустима, фактически она отправляется неявно, когда вы отправляете сообщение актору от другого актора. Если вы передадите this другому объекту, вы рискуете инкапсуляцией состояния актера. Помните, что единственный способ общаться с актором — через сообщения, т.е. с его ActorRef
  • self останется в силе после перезапуска актера, то есть вы можете продолжать отправлять сообщения тому же ActorRef (себе). Только когда актор остановлен, ссылка на ActorRef становится недействительной, и сообщения, отправленные на этот адрес, заканчиваются недоставленными письмами.
  • this больше не будет действовать после перезапуска актера. Создается экземпляр нового объекта типа Actor, чтобы очистить состояние субъекта, которое может быть скомпрометировано из-за сбоя.

Что означает перезапуск

Если сбой нельзя распознать конкретно, третью причину нельзя исключить, что приводит к выводу о необходимости очистки внутреннего состояния. Если супервизор решает, что другие его дочерние элементы или он сам не затронут коррупцией, т.е. из-за сознательного применения шаблона ядра ошибки — поэтому лучше всего перезапустить дочерний процесс. Это достигается созданием нового экземпляра базового класса Actor и заменой отказавшего экземпляра новым внутри дочернего ActorRef; возможность сделать это является одной из причин инкапсуляции акторов в специальные ссылки. Затем новый субъект возобновляет обработку своего почтового ящика, что означает, что перезапуск не виден за пределами самого субъекта, за исключением того, что сообщение, во время которого произошел сбой, не обрабатывается повторно.

Ссылка на субъекта и равенство путей

Обратите внимание, что перезапуск субъекта, вызванный сбоем, по-прежнему означает, что это то же самое воплощение субъекта, т. е. перезапуск не виден потребителю ActorRef.

В чем разница между ссылкой на актера и путем?

Ссылка на актера обозначает одного актера, и жизненный цикл ссылки соответствует жизненному циклу этого актера; путь актора представляет собой имя, которое может или не может быть занято актером, и сам путь не имеет жизненного цикла, он никогда не становится недействительным. Вы можете создать путь актера без создания актера, но вы не можете создать ссылку на актера без создания соответствующего актера.
Вы можете создать актера, завершить его, а затем создать новый актер с тем же путем актера. Новоиспеченный актер – это новое воплощение актера. Это не тот актер. Ссылка актера на старое воплощение недействительна для нового воплощения. Сообщения, отправленные на старую ссылку субъекта, не будут доставлены новому воплощению, даже если они имеют тот же путь.

person gabrielgiussi    schedule 15.03.2019