Я хочу отправить сообщение из экземпляра 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 из его экземпляра, но как?