это против себя внутри актерского класса Акка - PullRequest
5 голосов
/ 15 марта 2019

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

  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, потому что в сложных сценариях (производственная система), если субъект нарушается, например: выдает исключение, чем Iдумаю значение для this меняется.

1 Ответ

8 голосов
/ 15 марта 2019

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

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

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

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

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

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

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

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

...