在scala中调用akka actor上的方法

Ale*_*lex 10 scala actor akka

我有一个演员定义如此:

class nodeActor(ID: String) extends Actor
Run Code Online (Sandbox Code Playgroud)

它包含一个方法,用于在actor启动之前设置它:

def addRef(actor:ActorRef)
Run Code Online (Sandbox Code Playgroud)

我将这个actor实例化为:

val node1 = system.actorOf(Props(new nodeActor("node1")), name="node1")
Run Code Online (Sandbox Code Playgroud)

它返回一个ActorRef.编译器不允许我在ActorRef上调用"addRef",因为它是子类型的成员.所以我使用以下方式投射节点:

node1.asInstanceOf[nodeActor].addRef(link1)
Run Code Online (Sandbox Code Playgroud)

这让编译器感到高兴.然后在运行时我得到

java.lang.ClassCastException: akka.actor.LocalActorRef cannot be cast to ActorStressTest.nodeActor
Run Code Online (Sandbox Code Playgroud)

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

想法?

小智 7

如果你想做这个测试,那么在创建actor时你可以这样做:

import akka.testkit.TestActorRef
val actorRef = TestActorRef[MyActor]
val actor = actorRef.underlyingActor
Run Code Online (Sandbox Code Playgroud)

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


pag*_*_5b 6

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

  • 通过仅与ActorRef通过调用actorOf或获得的获得通信来封装actor的特定实现actorFor
  • 使用可用的(!,?)方法限制actor与消息传递之间的通信

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

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

  • 感谢您的回答。我将重构代码以牢记这一点。我知道您本来打算使用消息传递,但是我不知道您正在通过使用方法调用进行设置来主动停止表单。无论如何,再次感谢您,回答被接受。 (2认同)