如何在 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
可能是最适合存储Cancellable
s 的结构。如果你不打算重用taskName
,那么它会是一个很好的密钥(即你有一个Map[String, Cancellable]
),或者你可能想要包括taskActorRef
或message
。
具体如何做到这一点取决于参与者定义的风格(例如,是使用 FSM DSL,还是 context.become
,还是通过 var
s 跟踪状态?)。
【讨论】:
以上是关于如何在 Scala Akka 中停止 system.scheduler.schedule的主要内容,如果未能解决你的问题,请参考以下文章
如何让 Shiro 在 Scala + Akka + Spray 环境中工作
Akka演员(Scala)如何在内存不足时获得堆转储[重复]