如何从actor内部获取actor系统引用

时间:2014-08-10 21:23:30

标签: scala akka actor throttling

我有一个向自己发送消息的akka​​演员:

  def receive = {
    while (...) {
       self ! "some message"
    }
  }

我想使用Throttler来控制此actor发送给自己的消息流。

  val throttler = system.actorOf(Props(new TimerBasedThrottler(15 msgsPer (1.minute))))
  throttler ! SetTarget(Some(self))

然后更改while循环以向throttler发送消息:

    while (...) {
       throttler ! "some message"
    }

问题是我不知道如何从actor内部访问“系统”,以创建节流器。这该怎么做?有没有更好的方法?

4 个答案:

答案 0 :(得分:7)

为什么不作为儿童演员制作节流器?:

def receive = {
    val throttler = context.actorOf(Props(new TimerBasedThrottler(15 msgsPer (1.minute))))
    throttler ! SetTarget(Some(self))
    while (...) {
       throttler ! "some message"
    }
}

因为如果计算机演员死了就让Throttler活着是没有意义的。

答案 1 :(得分:6)

在actor内部,使用context.system访问ActorSystem。

答案 2 :(得分:5)

在Akka中,您可以使用Actor系统或Actor上下文创建一个Actor,如:

class FirstActor extends Actor {
  val child = context.actorOf(Props[MyActor], name = "myChild")
  // plus some behavior ...
}

context是每个Actor都可用的变量。

如果您使用actor创建actor,则它将成为创建actor的受监督子项,请参阅Akka Docs about supervisionActor Creation以获取更多信息。

答案 3 :(得分:4)

您可以使用context

val throttler = context.actorOf(Props(new TimerBasedThrottler(15 msgsPer (1.minute))))