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 从 null
到 ActorRef
- 只有 variables 才有可能。
如果我尝试使用 val 并通过为新实例重写实例来创建不可变 class,然后将其从旧实例换成新实例,我的 Actor actor
仍然链接到旧实例,其中 myActorRef == null
.
现在我找到了一种方法:只使用 var
而不是 val
或不可变的 class。
但我想使用 val 或什么都不用。
为此,我需要从它的实例中获取 ActorRef,但是如何获取?
没有理由这么复杂的舞蹈,就用ctx.self
。并且在询问之前请至少阅读最基本的文档,这甚至可以节省您的时间。
我想从 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 从 null
到 ActorRef
- 只有 variables 才有可能。
如果我尝试使用 val 并通过为新实例重写实例来创建不可变 class,然后将其从旧实例换成新实例,我的 Actor actor
仍然链接到旧实例,其中 myActorRef == null
.
现在我找到了一种方法:只使用 var
而不是 val
或不可变的 class。
但我想使用 val 或什么都不用。 为此,我需要从它的实例中获取 ActorRef,但是如何获取?
没有理由这么复杂的舞蹈,就用ctx.self
。并且在询问之前请至少阅读最基本的文档,这甚至可以节省您的时间。