gpt4 book ai didi

scala - 使用 Akka 在一天中的固定时间安排任务

转载 作者:行者123 更新时间:2023-12-03 04:27:50 24 4
gpt4 key购买 nike

我是 Akka 的初学者。我需要每天在固定时间安排一项任务,比如上午 8 点。例如,我知道如何定期安排任务

import akka.util.duration._

scheduler.schedule(0 seconds, 10 minutes) {
doSomething()
}

What is the simplest way to schedule tasks at fixed times of the day in Akka?

一个小括号

只需使用此功能即可轻松完成我想要的事情。玩具实现看起来像

scheduler.schedule(0 seconds, 24 hours) {
val now = computeTimeOfDay()
val delay = desiredTime - now

scheduler.scheduleOnce(delay) {
doSomething()
}
}

这并不难,但我引入了一点竞争条件。事实上,考虑一下如果我在上午 8 点之前启动它会发生什么。外部关闭将会开始,但当我计算延迟时,我们可能已经过了上午 8 点。这意味着应该立即执行的内部关闭将推迟到明天,从而跳过一天的执行。

有多种方法可以解决此竞争条件:例如,我可以每 12 小时执行一次检查,而不是立即安排任务,而是将其发送给一次不会接受多个任务的参与者。

但是,这可能已经存在于 Akka 或某些扩展中。

最佳答案

编写一次,每天运行

val GatherStatisticsPeriod = 24 hours

private[this] val scheduled = new AtomicBoolean(false)

def calcBeforeMidnight: Duration = {
// TODO implement
}

def preRestart(reason: Throwable, message: Option[Any]) {
self ! GatherStatisticsScheduled(scheduled.get)
super.preRestart(reason, message)
}

def schedule(period: Duration, who: ActorRef) =
ServerRoot.actorSystem.scheduler
.scheduleOnce(period)(who ! GatherStatisticsTick)

def receive = {

case StartServer(nodeName) =>
sender ! ServerStarted(nodeName)
if (scheduled.compareAndSet(false, true))
schedule(calcBeforeMidnight, self)

case GatherStatisticsTick =>
stats.update
scheduled.set(true)
schedule(GatherStatisticsPeriod, self)

case GatherStatisticsScheduled(isScheduled) =>
if (isScheduled && scheduled.compareAndSet(false, isScheduled))
schedule(calcBeforeMidnight, self)

}

我相信 Akka 的调度程序以某种方式在内部处理重启。我使用非持久的方式向自己发送消息——实际上没有严格的传递保证。此外,刻度可能会有所不同,因此 GatherStatisticsPeriod 可能是一个函数。

关于scala - 使用 Akka 在一天中的固定时间安排任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13700452/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com