在斯卡拉阿卡演员调用方法(call methods on akka actors in scala)

2019-08-02 12:11发布

我有一个定义为这样的演员:

class nodeActor(ID: String) extends Actor

它包含一个方法,它是用来建立男主角它开始之前:

def addRef(actor:ActorRef)

我实例化这个演员像这样:

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

返回我的ActorRef。 编译器不会让我打电话“的AddRef”上ActorRef,因为它的亚型中的一员。 所以我用投节点:

node1.asInstanceOf[nodeActor].addRef(link1)

这使编译器高兴。 然后,在运行时,我得到

java.lang.ClassCastException: akka.actor.LocalActorRef cannot be cast to ActorStressTest.nodeActor

这并不甚至似乎是有意义的我,因为它是一个亚型,我应该能够投给它。

想法?

Answer 1:

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

  • 仅与通信封装演员的具体实施ActorRef与呼叫来获得actorOfactorFor
  • 限制行为者之间的交流,消息传递,使用可用的( !? )方法

如果你需要创建一个参考ActorA到另一个ActorB ,您可以:

  • 创建裁判ActorBActorA的初始化代码,如图http://doc.akka.io/docs/akka/2.0.3/scala/actors.html
  • 发送ActorB的参考ActorA作为特定消息。 然后ActorA可以存储在参考范围内receive实现

如果您需要调用的方法满足某个接口/特质约束,看看类型化的演员



Answer 2:

如果你想创建演员你可以做这个测试时那么做到这一点:

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

然后你可以运行在演员的方法



Answer 3:

你可以投什么东西,编译器会很乐意这样做,但如果它不能在运行时检查将失败。 该ActorRef是不是你的实例Actor类或它的一个亚型。

当你这样做:

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

你回来的ActorRef ,以及应只发送短信。 除此之外,当你调用actor立即开始system.actorOf ,所以想呼吁的方法Actor在启动之前的实例是不可能的。

下面是从演员的描述阿卡文档解释演员的引用。



文章来源: call methods on akka actors in scala
标签: scala akka actor