计划在午夜每24小时重置一次

时间:2013-11-05 08:56:48

标签: akka scala-2.10 playframework-2.2

我有一个计数器“numberOrders”,我想每天午夜重置它,知道我一天有多少订单,我现在拥有的是:

val system = akka.actor.ActorSystem("system")
system.scheduler.schedule(86400000 milliseconds, 0 milliseconds){(numberOrders = 0)}

这段代码在def中,每次我得到一个新订单时都会调用,所以想要的是:从第一个订单或每个订单24小时后重置numberOrders,我不确定是否每次都有一个新订单将在24小时后重置,这不是我想要的。我想每天午夜休息变量,任何想法?谢谢!

2 个答案:

答案 0 :(得分:2)

进一步增加pushy的答案。由于您可能无法始终确定网站何时开始,如果您想确切地确定它在午夜运行,您可以执行以下操作

val system = akka.actor.ActorSystem("system")
val wait = (24 hours).toMillis - System.currentTimeMillis
system.scheduler.schedule(Duration.apply(wait, MILLISECONDS), 24 hours, orderActor, ResetCounterMessage)

可能不是最整洁的解决方案,但它可以完成任务。

答案 1 :(得分:1)

由于计划支持重复执行,您可以将interval参数设置为24小时,将初始延迟设置为从现在到午夜之间的时间量,并在启动时启动代码。你现在每次收到订单时似乎都在创建一个新的actorSystem,这似乎不太对,你也可以摆脱它。

我还建议使用调度方法,而不是向演员发送消息。这样处理订单的actor可以保持计数,如果收到ResetCounter消息,它只会重置计数器。你可以简单地写:

 system.scheduler.schedule(x seconds, 24 hours, orderActor, ResetCounterMessage)

当你最初启动你的演员系统时,并完成它。