Scala akka напечатал: как получить ActorRef для Actor из его экземпляра и отправить само сообщение? - PullRequest
1 голос
/ 14 марта 2020

Я хочу отправить сообщение из экземпляра Actor (класс / класс дела, из которого он создан) в его Actor.

Я получаю его, сохраняя экземпляр, а затем сохраняю ActorRef в нем:

val (instance, behaviour) = MyActorInstance(Nothing)
val actor = ActorSystem(instance, "SomeName123")
//save it here
instance.setMyActor(actor)

object MyActorInstance {
  def apply(ctx: ActorContext[Commands]): (MyActorInstance,Behavior[Commands]) = {
    val actorInstance = new MyActorInstance(ctx)
    val behaviour: Behavior[Commands] =
      Behaviors.setup { context =>
        {
          Behaviors.receiveMessage { msg =>
            actorInstance.onMessage(msg)
          }
        }
      }
    (actorInstance,behaviour)
  }
}

class MyActorInstance(context: ActorContext[Commands]) extends AbstractBehavior[Commands](context) {

  protected var myActorRef: ActorRef[Commands] = null

  def setMyActor(actorRef: ActorRef[Commands]): Unit = {
    myActorRef = actorRef
  }

  override def onMessage(msg: Commands): Behavior[Commands] = {
    msg match {
      case SendMyself(msg) =>
        myActorRef ! IAmDone(msg)
        Behaviors.same
      case IAmDone(msg) =>
        println(s"Send $msg to myself!")
        Behaviors.same
    }
  }
}

Здесь я сохраняю ActorRef в Actor для его экземпляра в var myActorRef. Затем я использую это myActorRef для отправки сообщения от экземпляра Actor к себе с помощью SendMyself сообщения.

Но для этого, как вы видите, я использую переменные, что нехорошо: для сохранения ActorRef необходимо переписать поле myActorRef экземпляра класса MyActorInstance с null на ActorRef - это возможно только с var iables.

Если я попытаюсь использовать val и создать неизменный класс, переписав его экземпляр для нового, а затем поменять его со старого на новый, мой Actor actor все еще будет связан со старым экземпляром, где myActorRef == null.

Теперь я нашел один способ: просто использовать var вместо val или неизменный класс.

Но я хочу использовать val или ничего. Для этого мне нужно получить ActorRef из его экземпляра, но как?

1 Ответ

2 голосов
/ 15 марта 2020

Нет причин для такого сложного танца, просто используйте ctx.self. И, пожалуйста, прочитайте хотя бы самую основную c документацию, прежде чем спрашивать, это даже сэкономило бы ваше время.

...