首页 > 解决方案 > Akka Actor 中的 timers.startSingleTimer 和 scheduler.scheduleOnce 有什么区别?

问题描述

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

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

我想了解选择正确的区别。

第一个是 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

问题:

标签: scalaakkaschedulingactor

解决方案


akka.actor.Timers.startSingleTimer

  • 只能在演员内部使用
  • 允许给自己安排消息,即不能给其他参与者安排消息
  • 如果演员死亡,活动计时器将自动取消
  • 跟踪用户提供的活动计时器key

context.system.scheduler.scheduleOnce

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

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

将参与者上下文传递给 scheduleOnce 方法是个好主意吗?

不确定你想用什么方式来做,但一般来说,actor上下文必须只在receive方法内使用,而不是在既不在回调方法中使用的actor之外传递Futures


推荐阅读