Scala akka 键入:如何从它的实例获取 ActorRef 到 Actor 并自己发送消息?

Scala akka typed: how to get ActorRef to Actor from it's instance and send message itself?

我想从 Actor 实例(案例 class/class 从它创建的行为)发送消息到它的 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 通过 SendMyself 消息将消息从 Actor 的实例发送到它自己。

但是为此,如你所见,我正在使用变量,这并不好:要保存 ActorRef,需要重写 MyActorInstance MyActorInstance 实例的字段 myActorRef class 从 nullActorRef - 只有 variables 才有可能。

如果我尝试使用 val 并通过为新实例重写实例来创建不可变 class,然后将其从旧实例换成新实例,我的 Actor actor 仍然链接到旧实例,其中 myActorRef == null.

现在我找到了一种方法:只使用 var 而不是 val 或不可变的 class。

但我想使用 val 或什么都不用。 为此,我需要从它的实例中获取 ActorRef,但是如何获取?

没有理由这么复杂的舞蹈,就用ctx.self。并且在询问之前请至少阅读最基本的文档,这甚至可以节省您的时间。