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

Akka 计划在午夜每24小时重置一次,akka,scala-2.10,playframework-2.2,Akka,Scala 2.10,Playframework 2.2,我有一个计数器“numberOrders”,我想每天午夜重置它,以了解我一天收到多少订单,我现在拥有的是: val system = akka.actor.ActorSystem("system") system.scheduler.schedule(86400000 milliseconds, 0 milliseconds){(numberOrders = 0)} 这段代码在def中,每次我收到新订单时都会调用def,所以我想它做的是:在第一个订单或每个订单24小时后重置numberOrde

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

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

这段代码在def中,每次我收到新订单时都会调用def,所以我想它做的是:在第一个订单或每个订单24小时后重置numberOrders,我不确定是否每次有新订单都会在24小时后重置,这不是我想要的。我想每天午夜休息,知道吗?谢谢

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

我还建议使用调度方法,它将消息发送给参与者。通过这种方式,处理订单的参与者可以保持计数,如果它收到ResetCounter消息,它将简单地重置计数器。你可以简单地写:

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

当你开始启动你的演员系统时,你就可以使用它了。

进一步增加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)

可能不是最整洁的解决方案,但它确实起到了作用。

仅供参考:DSL的持续时间支持
hours
,因此可以随意使用
24小时
,而不是
86400000毫秒
;)我试过了,但它抱怨小时类型不匹配;发现:Int(24)required:?{def hours:?}注意隐式转换不适用,因为它们是不明确的:类型为(n:Int)com.github.nscala_time.time.RichInt的trait IntImplicits中的方法RichInt和类型为(n:Int)concurrent.duration.DurationInt的包duration中的方法DurationInt都可能是Int的转换函数(24)到{def hours:?}注意,此解决方案不安全。您好,2019年开始。