scala - 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
问题:
- 在为自己安排消息的情况下,它们之间的主要区别是什么?
- 将actor上下文传递给
scheduleOnce
方法是个好主意吗?
解决方案
akka.actor.Timers.startSingleTimer
- 只能在演员内部使用
- 只允许给自己安排消息,即不能给其他参与者安排消息
- 如果演员死亡,活动计时器将自动取消
- 跟踪用户提供的活动计时器
key
context.system.scheduler.scheduleOnce
- 可用于在 Actor 外部和内部调度消息
- 需要明确
ActorRef
的receiver
和可选的sender
- 没有自动清理过程。所有都应该通过调用返回显式处理
akka.actor.Cancellable
因此,如果您只需要为自己安排消息,请选择akka.actor.Timers
将参与者上下文传递给 scheduleOnce 方法是个好主意吗?
不确定你想用什么方式来做,但一般来说,actor上下文必须只在receive
方法内使用,而不是在既不在回调方法中使用的actor之外传递Futures
。
推荐阅读
- r - 在 R 单位包中使用英制 slug 单位来表示质量
- drake - Mac 上的 Drake 安装问题
- css - CSS Grid:如何将所有内容放在一行上?
- html - 将动画阴影应用于 Bootstrap 4 卡片
- amazon-s3 - S3 拒绝无服务器框架 lambda 函数访问
- kubernetes - 如何正确地将 OpenLDAP 集成到 Keycloak?
- c++ - 为什么 C++ 向量交换方法具有恒定的时间复杂度
- django-3.0 - django3文件上传默认权限是420?
- ruby-on-rails - 如何修复损坏的系统 Ruby 安装
- git - 当你想在 github 上使用 Gatsby 实现的博客并在另一台计算机上使用时,如何构建?