在scala中调用akka actor上的方法

时间:2012-11-08 14:50:47

标签: scala akka 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

这对我来说似乎没有意义,因为它是一个子类型,我应该能够投射它。

想法?

3 个答案:

答案 0 :(得分:7)

如果您想要进行测试,那么在创建actor时您可以这样做:

import akka.testkit.TestActorRef
val actorRef = TestActorRef[MyActor]
val actor = actorRef.underlyingActor

然后你可以在actor上运行方法

答案 1 :(得分:6)

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

  • 通过仅与通过调用ActorRefactorOf
  • 获得的actorFor进行通信来封装演员的具体实现
  • 使用可用的(!?)方法限制actor与消息传递之间的通信

如果您需要在ActorA中创建与另一个ActorB的引用,您可以:

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

答案 2 :(得分:1)

您可以将任何内容转换为任何内容,编译器也会很乐意这样做,但如果不可能,运行时检查将失败。 ActorRef不是您的Actor类的实例或其子类型。

执行此操作时:

system.actorOf(Props(new nodeActor("node1")), name="node1")

您将返回ActorRef,您应该只向其发送消息。除此之外,当您调用system.actorOf时,actor立即启动,因此尝试在Actor实例启动之前调用方法是不可能的。

以下是Akka Docs解释演员引用的演员的描述。