scala - 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
实例的字段MyActorInstance
from null
to ActorRef
- 只有使用var iables 才有可能。
如果我尝试使用 val 并通过将其实例重写为 new 来创建不可变类,然后将其从旧的交换到新的,我的 Actoractor
仍然链接到旧实例 where myActorRef == null
。
现在我找到了一种方法:只使用var
代替val
或不可变类。
但我想使用 val 或什么都不用。为此,我需要从它的实例中获取 ActorRef,但是如何?
解决方案
这种复杂的舞蹈没有理由,只需使用ctx.self
. 并且请在询问之前至少阅读最基本的文档,它甚至可以节省您的时间。
推荐阅读
- asp.net - ASP.NET Web API Azure Blob 存储非结构化
- java - 错误:不兼容的类型:机器消息无法转换为片段
- python - 如何通过 pandas 替换功能传递字典?
- excel - 使用 Apache 部署 Excel 或 Office JavaScript 加载项
- html - 如何将 https://youtube.com 放入 iframe 不是视频而是 youtube 本身
- javascript - 我如何记住文件中早期函数中引用的变量?
- python - 如何更改机器人状态但仅在一台服务器中可见
- php - 如何在主视图 laravel 中传递用户关系
- c++ - 调用对象内部和外部函数的不同行为
- php - 在 Laravel 中验证访问方法的更好方法是什么