如何在Scala Akka中停止一个系统.scheduler.schedule

wa7juj8i  于 2022-11-05  发布在  Scala
关注(0)|答案(1)|浏览(151)

我现在有一个方法,可以创建一个调度程序,在设定的时间间隔内向参与者发送消息。
我可以停止创建这些调度程序的执行元,但这不会停止调度程序。

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")
  }

正如您所想象的,在中,为每个参与者调用方法,我希望在该参与者启动后为其创建一个计划。我以前使用过调度程序,并通过将其分配给瓦尔,然后对它们使用.cancel()来取消它们,但是,鉴于此调度程序用于计划多个事情,我不确定如何才能取消此操作。
谢谢你的帮助!

r55awzrz

r55awzrz1#

要取消计划的发送,您需要保存调度程序在您调用schedule时提供的Cancellable
由于您是在执行元中调度,因此此操作的逻辑位置将是执行元状态的一部分:您可以稍后向执行元发送消息以通知它取消已排定的发送。
Map可能是最适合存储Cancellable的结构。如果你不打算重用taskName,那么它将是一个很好的键(也就是说,你将有一个Map[String, Cancellable]),或者你可能想包括taskActorRefmessage
具体如何执行取决于参与者定义的风格(例如,它是使用FSM DSL还是context.become,还是通过var跟踪状态?)。

相关问题