首页 > 解决方案 > Scala akka 键入:如何从它的实例中获取 ActorRef 到 Actor 并自己发送消息?

问题描述

我想从 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实例的字段MyActorInstancefrom nullto ActorRef- 只有使用var iables 才有可能。

如果我尝试使用 val 并通过将其实例重写为 new 来创建不可变类,然后将其从旧的交换到新的,我的 Actoractor仍然链接到旧实例 where myActorRef == null

现在我找到了一种方法:只使用var代替val或不可变类。

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

标签: scalareferenceakkaactorself

解决方案


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


推荐阅读