Akka Actor 中 timers.startSingleTimer 和 scheduler.scheduleOnce 有什么区别?

What is the difference between timers.startSingleTimer and scheduler.scheduleOnce in Akka Actor?

我正在设计一个应该安排向自己发送消息的 actor。

我注意到至少有两种方法可以做到。

我想了解其中的区别,以便选择合适的。

第一种是akka.actor.Timers的一种方法:

def startSingleTimer(key: Any, msg: Any, timeout: FiniteDuration): Unit

第二种是 actor 上下文系统调度器的常见方式:

final def scheduleOnce(
    delay:    FiniteDuration,
    receiver: ActorRef,
    message:  Any)(implicit executor: ExecutionContext,
                            sender: ActorRef = Actor.noSender): Cancellable

问题:

akka.actor.Timers.startSingleTimer

  • 只能在一个actor中使用
  • 允许向自己安排消息,即不可能向其他一些参与者安排消息
  • 如果 actor 死亡,活动计时器会自动取消
  • 跟踪用户提供的活动计时器 key

context.system.scheduler.scheduleOnce

  • 可用于在 actors 外部和内部调度消息
  • receiver 需要明确的 ActorRef 和可选的 sender
  • 没有自动清理过程。所有都应该通过调用返回的 akka.actor.Cancellable
  • 来明确处理

因此,如果您只需要为自己安排消息,请选择 akka.actor.Timers

Is it a good idea to pass actor context to scheduleOnce method?

不确定您要以何种方式执行此操作,但一般来说,actor 上下文必须仅在 receive 方法内使用,而不能传递到 actor 外部,也不会在 Futures 的回调方法中使用.