如何在 Scala Akka 中停止 system.scheduler.schedule

Posted

技术标签:

【中文标题】如何在 Scala Akka 中停止 system.scheduler.schedule【英文标题】:How to stop a system.scheduler.schedule in Scala Akka 【发布时间】:2021-11-15 03:27:45 【问题描述】:

我目前有一个方法可以创建一个调度程序,以设定的时间间隔向我的演员发送消息。但是,我现在正在尝试实现系统关闭的新功能。

我可以停止创建这些调度程序的 Actor,但这不会停止调度程序。

private def initialiseTask(taskName: String, taskActorRef: ActorRef, interval: FiniteDuration,
                             startDelay: FiniteDuration = 0 milliseconds, message: Any = "tick"): Unit = 
    logger.debug(s"Initialising task: $taskName")
    system.scheduler.schedule(startDelay,
      interval,
      taskActorRef,
      message)
    logger.debug(s"$taskName initialised")
  

您可以想象,在为每个演员调用该方法时,我想为该演员启动后创建一个时间表。我之前使用过调度程序,并通过将它们分配给一个 val 来取消它们,然后在它们上使用 .cancel(),但是,鉴于此调度程序用于调度多个事情,我不确定如何取消它。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

要取消预定的发送,您需要保存调度程序在您调用schedule 时为您提供的Cancellable

由于您是在一个参与者中进行调度,因此这样做的逻辑位置是作为参与者状态的一部分:您可以稍后向参与者发送一条消息,告诉它取消计划的发送。

Map 可能是最适合存储Cancellables 的结构。如果你不打算重用taskName,那么它会是一个很好的密钥(即你有一个Map[String, Cancellable]),或者你可能想要包括taskActorRefmessage

具体如何做到这一点取决于参与者定义的风格(例如,是使用 FSM DSL,还是 context.become,还是通过 vars 跟踪状态?)。

【讨论】:

以上是关于如何在 Scala Akka 中停止 system.scheduler.schedule的主要内容,如果未能解决你的问题,请参考以下文章

Scala框架Akka学习

如何让 Shiro 在 Scala + Akka + Spray 环境中工作

Scala如何使用akka actor有效地处理超时操作

Akka演员(Scala)如何在内存不足时获得堆转储[重复]

如何使用 scala 2.9.x 运行 akka 2.1-snapshots?

如何理解 AKKA 中使用的这种 CCAS 锁定机制?