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

How to stop a system.scheduler.schedule in Scala Akka

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

我可以停止创建这些调度程序的 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(),但是,鉴于此调度程序用于安排多个事物,我不确定如何取消它。

感谢您的帮助!

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

由于您在 actor 中进行调度,因此合乎逻辑的位置是作为 actor 状态的一部分:稍后您可以向 actor 发送一条消息,告诉它取消预定的发送。

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

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