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

7

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

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

我想了解它们之间的区别,以选择正确的方法。

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

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

第二种方法是使用演员上下文系统的调度程序,这是一种相当常见的方式:
final def scheduleOnce(
    delay:    FiniteDuration,
    receiver: ActorRef,
    message:  Any)(implicit executor: ExecutionContext,
                            sender: ActorRef = Actor.noSender): Cancellable

问题:

  • 在将消息调度给自身方面,它们之间的主要区别是什么?
  • 将演员上下文传递给scheduleOnce方法是个好主意吗?

计时器不是线程安全的。如果您想同时使用未来和取消一些计时器,可能会出现问题(因为缺乏线程安全性意味着对计时器的引用可能会丢失)。 - undefined
1个回答

7

akka.actor.Timers.startSingleTimer

  • 只能在actor内部使用
  • 仅允许将消息定时发送给自己,即不能将消息定时发送给其他actor
  • 如果actor死亡,则活动定时器会自动取消
  • 通过用户提供的key跟踪活动定时器

context.system.scheduler.scheduleOnce

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

因此,如果只需将消息定时发送给自身,请选择akka.actor.Timers

将actor上下文传递给scheduleOnce方法是一个好主意吗?

不确定您想以何种方式进行,但通常actor上下文必须仅在receive方法内部使用,不能在actor之外传递,也不能在Futures的回调方法中使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接