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



我有一个akka actor,它向自己发送消息:

  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内部访问"系统"来创建节流器。如何做到这一点?有没有更好的办法?

在actor内部,使用context。

为什么不将节流器创建为子演员呢?:

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

因为如果计算参与者已经死亡,那么让Throttler存活是没有意义的。

您可以使用context:

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

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

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

context是每个Actor可用的变量。

如果你用actor Context创建actor,它将成为创建actor的受监督的子对象,请参考Akka文档中关于监督和actor创建的更多信息。

最新更新