gpt4 book ai didi

scala - Scala中Akka Actor 的调用方法

转载 作者:行者123 更新时间:2023-12-04 03:29:13 26 4
gpt4 key购买 nike

我有一个 Actor 定义如下:

class nodeActor(ID: String) extends Actor

其中包含一个方法,该方法用于在启动actor之前对其进行设置:
def addRef(actor:ActorRef)

我实例化这个 Actor 是这样的:
val node1 = system.actorOf(Props(new nodeActor("node1")), name="node1")

这给我返回了一个ActorRef。编译器不允许我在ActorRef上调用“addRef”,因为它是子类型的成员。因此,我使用以下方法转换节点:
node1.asInstanceOf[nodeActor].addRef(link1)

这使编译器保持满意状态。然后在运行时我得到
java.lang.ClassCastException: akka.actor.LocalActorRef cannot be cast to ActorStressTest.nodeActor

这对我来说似乎根本没有意义,因为它是一个子类型,我应该可以强制使用它。

有想法吗?

最佳答案

您不应该直接从另一个类调用actor的方法。它破坏了系统的整体设计,即

  • 通过仅与通过调用ActorRefactorOf
  • 获得的 actorFor通信来封装 Actor 的特定实现
  • 使用可用的(!?)方法
  • 将角色之间的通信限制为消息传递

    如果您需要在 ActorA中创建对另一个 ActorB的引用,则可以:
  • ActorB的初始化代码中创建对ActorA的引用,如http://doc.akka.io/docs/akka/2.0.3/scala/actors.html
  • 所示。
  • ActorB的引用作为特定消息发送到ActorA。然后ActorA可以将引用存储在receive实现


  • 如果您需要调用一种方法来满足Interface/Trait约束,请查看 Typed Actors

    关于scala - Scala中Akka Actor 的调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13291346/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com