【问题标题】:How to stop a system.scheduler.schedule in Scala Akka如何在 Scala Akka 中停止 system.scheduler.schedule
【发布时间】:2023-03-11 20:33:01
【问题描述】:

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

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

感谢您的帮助!

【问题讨论】:

    标签: scala akka scheduler actor schedule


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      相关资源
      最近更新 更多