获得Akka演员参考的最佳方式是什么?

时间:2014-02-03 14:43:01

标签: scala akka

我有点困惑的是,一旦它在Akka系统中被创建,我应该如何获得对我的Actor的引用。说我有以下内容:

class MyActor(val x: Int) extends Actor {

 def receive = {
  case Msg => doSth()
 }
}

在某个阶段我会创建演员如下:

val actorRef = system.actorOf(Props(new MyActor(2), name = "Some actor")

但是当我需要引用MyActor对象时,我看不出有什么方法可以从actor ref中获取它?

由于 DES

2 个答案:

答案 0 :(得分:7)

我正在添加我的评论作为答案,因为它似乎被视为值得投入的答案。

无法直接访问演员是演员系统背后的全部理念。你不应该能够获得底层的actor类实例。 actor ref是actor类实例的轻量级代理。允许人们直接访问actor实例可能导致可变数据问题/并发状态更新问题的路径,这是一条不好的路径。通过强制您通过引用(以及邮箱),状态和数据将始终是安全的,因为一次只处理一条消息。

答案 1 :(得分:2)

我认为cmbaxter有一个很好的答案,但我想让它更清楚一些。由于以下原因,ActorRef是你的朋友:

  1. 您无法访问基础角色。 Actors在创建时从Dispatcher接收执行线程。它们一次只对一个邮箱消息进行操作,因此除非您引入它,否则不必担心actor内部的并发(例如,通过委托与Future或其他Actor实例异步处理消息)。如果有人可以访问ActorRef后面的底层类,他们可以通过使用另一个线程的方法轻松调用actor,从而否定了使用Actor首先避免并发的意义。
  2. ActorRefs提供位置透明度。通过这个,我的意思是Actor实例可以在本地存在于与您希望向其发送消息的actor相同的JVM和机器上,或者它可以存在于不同的JVM上,不同的盒子上,不同的数据中中央。你不知道,你不在乎,你的代码没有充斥着如何将消息发送给该演员的细节,从而使其更具说明性(专注于你想要做的事情,不是它将如何完成)。当您开始使用Remoting或Clusters时,这将证明非常有价值。
  3. 当发生故障时,ActorRef会屏蔽其背后的actor实例。使用旧的Scala Actors,你没有这样的代理,当一个演员“死”(抛出异常)导致在其位置创建一个新的Actor类型实例。然后,您必须将新实例引用传播给任何需要它的人。使用ActorRef,你并不关心Actor已被转世 - 它都是透明的。
  4. 当您想要使用TestActorRef.underlyingActor进行测试时,有一种方法可以访问基础actor。这样,您可以针对actor内部方法编写的功能编写单元测试。用于检查基本业务逻辑而无需担心Akka动态。
  5. 希望有所帮助。